我正在尝试创建一个简单的折线图来比较两个文件中的列。我已经编写了一些代码,并且想知道如何忽略我拥有的两个.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
答案 0 :(得分: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)
答案 1 :(得分:0)
因此,您的文件不以逗号分隔,这实际上使这更容易一些。我们遍历第一个文件,并在分隔空白行(用于分隔数据中的项目的制表符/空格)之后的每行中取第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)
然后,您将您感兴趣的值放入两个希望长度相等的列表中,并且可以从那里进行任何比较或绘制您想要的图表。
答案 2 :(得分:0)
编辑:在函数定义上添加分隔符选项和精度
如果您只想保留一列并在计数行后停止读取,只需将值附加到循环中的列表中,并在耗尽时中断。但是,如果您的文件使用除逗号(,
)之外的其他内容作为分隔符,则必须指定它。并且不要重复函数定义:一个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
列的列表