2

我有一个 .csv,在 2 列中有 3000 行数据,如下所示:

uc007ayl.1  ENSMUSG00000041439
uc009mkn.1  ENSMUSG00000031708
uc009mkn.1  ENSMUSG00000035491

在另一个文件夹中,我有一个名称如下的图表:

uc007csg.1_nt_counts.txt
uc007gjg.1_nt_counts.txt

您应该注意到这些图表的名称与我的第一列的格式相同

我正在尝试使用 python 来识别那些具有图形的行并在新的 .txt 文件中打印第二列的名称

这些是我的代码

import csv
with open("C:/*my dir*/UCSC to Ensembl.csv", "r") as f:
reader = csv.reader(f, delimiter = ',')
    for row in reader:
        print row[0]

但据我所知,我被困住了。

4

5 回答 5

3

您快到了:

import csv
import os.path
with open("C:/*my dir*/UCSC to Ensembl.csv", "rb") as f:
    reader = csv.reader(f, delimiter = ',')
    for row in reader:
        graph_filename = os.path.join("C:/folder", row[0] + "_nt_counts.txt")
        if os.path.exists(graph_filename):
            print (row[1])

请注意,重复调用os.path.exists可能会减慢进程,尤其是当目录位于远程文件系统上并且文件数量不超过 CSV 文件中的行数时。您可能想os.listdir改用:

import csv
import os

graphs = set(os.listdir("C:/graph folder"))
with open("C:/*my dir*/UCSC to Ensembl.csv", "rb") as f:
    reader = csv.reader(f, delimiter = ',')
    for row in reader:
        if row[0] + "_nt_counts.txt" in graphs:
            print (row[1])
于 2012-07-31T10:25:46.183 回答
1

首先,尝试查看是否print row[0]确实给出了正确的文件标识符。

其次,连接文件的路径row[0]并检查这个完整路径是否存在(如果文件确实存在)os.path.exists(path)(参见http://docs.python.org/library/os.path.html#os.path.exists)。

如果它退出,您可以将行[1](第二列)写入一个新文件f2.write("%s\n" % row[1](当然首先您必须打开f2写入)。

于 2012-07-31T10:24:18.073 回答
0
result = open('result.txt', 'w')
for line in open('C:/*my dir*/UCSC to Ensembl.csv', 'r'):
    line = line.split(',')
    try:
        open('/path/to/dir/' + line[0] + '_nt_counts.txt', 'r')
    except:
        continue
    else:
        result.write(line[1] + '\n')
result.close()
于 2012-07-31T10:28:28.003 回答
0

那么,下一步是检查文件是否存在?有几种方法,但我喜欢 EAFP方法。

try:
   with open(os.path.join(the_dir,row[0])) as f: pass
except IOError:
   print 'Oops no file'

the_dir是文件所在的目录。

于 2012-07-31T10:25:19.930 回答
0
import csv
import os

# get prefixes of all graphs in another directory
suff = '_nt_counts.txt'
graphs = set(fn[:-len(suff)] for fn in os.listdir('another dir') if fn.endswith(suff))

with open(r'c:\path to\file.csv', 'rb') as f:
    # extract 2nd column if the 1st one is a known graph prefix
    names = (row[1] for row in csv.reader(f, delimiter='\t') if row[0] in graphs)
    # write one name per line
    with open('output.txt', 'w') as output_file:
        for name in names:
            print >>output_file, name
于 2012-07-31T10:41:17.700 回答