Python: игнорирование определенных строк в файле csv

#python #csv

#python #csv

Вопрос:

Я пытаюсь создать простой линейный график для сравнения столбцов из двух файлов. Я написал некоторый код и хотел бы знать, как игнорировать строки в двух .csv-файлах, которые у меня есть. Код выглядит следующим образом:

 import numpy as np
import csv
from matplotlib import pyplot as plt

def read_cell(x, y):
        with open('Illumina_Heart_Gencode_Paired_End_Novel_Junctions.csv', 'r') as f:
                reader = csv.reader(f)
                y_count = 0
                for n in reader:
                        if y_count == y:
                                cell = n[x]
                                return cell
                        y_count  = 1
print(read_cell(6, 932)

def read_cell(x, y):
        with open('Illumina_Heart_RefSeq_Paired_End_Novel_Junctions.csv', 'r') as f:
                reader = csv.reader(f)
                y_count = 0
                for n in reader:
                        if y_count == y:
                                cell = n[x]
                                return cell
                        y_count  = 1
print(read_cell(6, 932))


d1 = []
for i in set1:
    try:
        d1.append(float(i[5]))
    except ValueError:
        continue

d2 = []
for i in set2:
    try:
        d2.append(float(i[5]))
    except ValueError:
        continue

min_len = len(d1)
if len(d2) < min_len:
    min_len = len(d2)
d1 = d1[0:min_len]
d2 = d2[0:min_len]

plt.plot(d1, d2, 'r*')
plt.plot(d1, d2, 'b-')
plt.xlabel('Data Set 1: PE_NJ')
plt.ylabel('Data Set 2: PE_SJ')
plt.show()
 

Первый файл csv содержит 932 строки, а второй — 99 154 строки. Я заинтересован только в том, чтобы взять первые 932 строки из обоих файлов, а затем хочу сравнить 7-й столбец в обоих файлах.

Как мне это сделать?

Первый файл выглядит следующим образом:

 chr1    1718493 1718764 2   2   0   12  0   24
chr1    8928117 8930883 2   2   0   56  0   24
chr1    8930943 8931949 2   2   0   48  0   25
chr1    9616316 9627341 1   1   0   12  0   24
chr1    10166642    10167279    1   1   0   31  1   24
 

Второй файл выглядит так:

 chr1    880181  880421  2   2   0   15  0   21
chr1    1718493 1718764 2   2   0   12  0   24
chr1    8568735 8585817 2   2   0   12  0   21
chr1    8617583 8684368 2   2   0   14  0   23
chr1    8928117 8930883 2   2   0   56  0   24
 

Комментарии:

1. CSV разделяются запятыми. Значения, разделенные запятыми ..

2. @ChrisArena Я новичок в такого рода вещах. Чем CSV-файл будет отличаться от файла .txt? Я получил этот вывод, выполнив команду head -5 «filename».

3. CSV-файл содержит записи, разделенные запятыми. В вашем файле есть записи, разделенные табуляциями.

4. Существуют также CSV-файлы с разделителями табуляции, но они редко поддерживаются

Ответ №1:

Одним из возможных подходов было бы прочитать все строки из первого (более короткого) файла, узнать его длину (N), прочитать N строк из второго файла, взять k интересующий вас столбец из обоих файлов.

Что-то вроде (настройка разделителя для вашего случая):

 def read_tsv_file(fname): # reads the full contents of tab-separated file (like you have)
    return list(csv.reader(open(fname, 'rb'), delimiter='t'))

def take_nth_column(first_array, second_array, n): # returns a tuple containing nth columns from both arrays, with length corresponding to the length of the smaller array
    len1 = len(first_array)
    len2 = len(second_array)
    min_len = len1 if len1<=len2 else len2
    col1 = [row[n] for row in first_array[:min_len]]
    col2 = [row[n] for row in second_array[:min_len]]
    return (col1, col2)


first_array = read_tsv_file('your-first-file')
second_array = read_tsv_file('your-second-file')
(col1, col2) = take_nth_column(first_array, second_array, 7)
 

Ответ №2:

Таким образом, ваш файл не разделяется запятыми, что на самом деле немного упрощает задачу. Мы просматриваем первый файл и берем 7-й элемент в каждой строке после разделения строки на пробелы (табуляции / пробелы, которые разделяют элементы в ваших данных). Затем мы делаем то же самое для следующего файла, но если мы проходим мимо 932-й строки, мы выходим из цикла и заканчиваем.

Я бы сделал это примерно так:

 file1_values = []
file2_values = []

with open('file1') as f1:
    for line in f1:
         seventh_column = line.split()[6]
         file1_values.append(seventh_column)

with open('file2') as f2:
    for i, line in enumerate(f2):
         if i > 932:
             break
         seventh_column = line.split()[6]
         file2_values.append(seventh_column)
 

Затем у вас есть интересующие вас значения, помещенные в два списка, надеюсь, одинаковой длины, и вы можете перейти оттуда, выполняя любые сравнения или построение графиков, которые вы хотели бы сделать.

Ответ №3:

РЕДАКТИРОВАТЬ: добавить параметр разделителя и точность определения функции

Если вы просто хотите сохранить один столбец и прекратить чтение после количества строк, просто добавьте значения в список в своем цикле и прервите его, когда он будет исчерпан. Но если в вашем файле в качестве разделителя используется что-либо иное, кроме запятой ( , ), вы должны указать это. И не повторяйте определение функции: def достаточно одного. Таким образом, ваша функция чтения может быть такой :

 def read_column(file_name, x, y):
        cells = []
        with open(file_name, 'r') as f:
                reader = csv.reader(f, delimiter="t")
                y_count = 0
                for n in reader:
                        y_count  = 1
                        if y_count > y:
                                break
                        cells.append(n[x])
       return cells
 

Таким образом, функция возвращает список со x столбцом в y первых строках