0

以下の私のcsvファイル(test.csv)コンテンツサンプル:注:私のtest.csvファイルは約60MBです。

"Position","Value"
"2545600","19"
"2545601","19"
"2545602","19"
"2545603","19"
"2545604","20"
"2545605","20"
"2545606","21"
"2545607","22"
"2545608","21"
"2545609","20"
"2545610","21"
"2545611","18"
"2545612","19"
"2545613","21"
"2545614","21"
"2545615","21"
"2545616","21"
"2545617","22"
"2545618","25"
"2545619","25"

以下の私のPythonコード(test.py):

#!/usr/bin/python
import sys

txt = open(sys.argv[1], 'r')
out = open(sys.argv[2], 'w')
mil = float(sys.argv[3])

out.write('chr\tstart\tend\tfeature\t'+sys.argv[2]+'\n')

for line in txt:
    if 'Position' not in line:
        line = line.strip('",\n')
        line = line.split('","')

        line[1] = str(int(line[1])/mil)

        out.write('gi|255767013|ref|NC_000964.3|\t'+line[0]+'\t'+line[0]+'\t\t'+line[1]+'\n')

txt.close()
out.close()

私のコマンドライン:

python test.py test.csv test.igv 5

コマンドを実行した後、エラーが発生しました:

Traceback (most recent call last):
  File "test.py", line 15, in <module>
    line[1] = str(int(line[1])/mil)
ValueError: invalid literal for int() with base 10: '3"\r'

ただし、新しい空のcsvファイル(small.csv)を作成し、test.csvファイルから数行(上記のサンプルのように)だけコピーして貼り付ける場合。次に、そのコマンドを正常に実行します。

python test.py small.csv small.igv 5

small.csvを入力:

"Position","Value"
"2545600","19"
"2545601","19"
"2545602","19"
"2545603","19"
"2545604","20"
"2545605","20"
"2545606","21"
"2545607","22"
"2545608","21"
"2545609","20"

small.igvを出力します:

chr start   end feature small.igv
gi|255767013|ref|NC_000964.3|   2545600 2545600     3.8
gi|255767013|ref|NC_000964.3|   2545601 2545601     3.8
gi|255767013|ref|NC_000964.3|   2545602 2545602     3.8
gi|255767013|ref|NC_000964.3|   2545603 2545603     3.8
gi|255767013|ref|NC_000964.3|   2545604 2545604     4.0
gi|255767013|ref|NC_000964.3|   2545605 2545605     4.0
gi|255767013|ref|NC_000964.3|   2545606 2545606     4.2
gi|255767013|ref|NC_000964.3|   2545607 2545607     4.4
gi|255767013|ref|NC_000964.3|   2545608 2545608     4.2
gi|255767013|ref|NC_000964.3|   2545609 2545609     4.0

それが私が欲しいすべてです。それで問題は、なぜ私はより大きなサイズのcsvファイルでそれを行うことができないのですか?

4

3 に答える 3

4

試す

for line in ..... :
     line = line.strip()

これにより、行末が行文字列から削除されます。

より良い解決策:そのような側面を処理するPythonのcsvモジュールを使用してください。

于 2013-01-21T19:22:37.797 に答える
1

この場合、 csvモジュールを使用する方がはるかに優れています。csvファイルから読み取られた各行は、文字列のリストとして返されます。空白を削除する問題は発生しませんcsv.reader。関数の引数で区切り文字(ここでは不要)を指定できます。

import csv
import sys

out = open(sys.argv[2], 'w')
mil = float(sys.argv[3])

out.write('chr\tstart\tend\tfeature\t'+sys.argv[2]+'\n')
with open(sys.argv[1], 'rb') as f:
    reader = csv.reader(f, delimiter=',')
    headers = reader.next()    # Consider headers separately
    for line in reader:
        line[1] = str(int(line[1])/mil)
        out.write('gi|255767013|ref|NC_000964.3|\t'+line[0]+'\t'+line[0]+'\t\t'+line[1]+'\n')
out.close()

python test.py test.csv test.igv 5 && cat test.igv期待される出力を表示する必要があります。

于 2013-01-21T19:48:25.453 に答える
0

提案されているように、csvモジュールの方が便利です。

例えば:

import csv
f = open("ex.csv")
for line in csv.reader(f):
    print line

およびのデータ

"Position","Value"
"2545600","19"
"2545601","19"
"2545602","19"
"2545603","19"

の出力を与える

['Position', 'Value']
['2545600', '19']
['2545601', '19']
['2545602', '19']
['2545603', '19']

これははるかに管理しやすいです。

また、csvモジュールはcsvファイルの書き込みも行います。

于 2013-01-21T19:31:35.330 に答える