2

次のように、2列に3000行のデータを含む.csvがあります。

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

別のフォルダに、次のような名前のグラフがあります。

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

これらのグラフには、私の最初の列と同じ形式の名前が付いていることに注意してください。

Pythonを使用して、グラフのある行を識別し、2番目の列の名前を新しい.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]このフルパスが存在するかどうかを確認します(ファイルが実際に存在する場合) ( http://docs.python.org/library/os.path.html#os.path.existsos.path.exists(path)を参照) )。

終了した場合は、row [1](2番目の列)を新しいファイルに書き込むことができますf2.write("%s\n" % row[1](もちろん、最初に開く必要がありますf2)。

于 2012-07-31T10:24:18.073 に答える
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
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
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 に答える