我有一个.csv,包含2行中的3000行数据,如下所示:
uc007ayl.1 ENSMUSG00000041439
uc009mkn.1 ENSMUSG00000031708
uc009mkn.1 ENSMUSG00000035491
在另一个文件夹中,我有一个名称如下的图表:
uc007csg.1_nt_counts.txt
uc007gjg.1_nt_counts.txt
您应该注意到这些图表的名称与我的第1列的格式相同
我正在尝试使用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]
但就我而言,我被困住了。
答案 0 :(得分: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])
答案 1 :(得分: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
进行写作)。
答案 2 :(得分:0)
那么,下一步是检查文件是否存在?有几种方法,但我喜欢EAFP方法。
try:
with open(os.path.join(the_dir,row[0])) as f: pass
except IOError:
print 'Oops no file'
the_dir
是文件所在的目录。
答案 3 :(得分: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()
答案 4 :(得分: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