2013-01-21 190 views
0

我的以下csv文件(test.csv)含量樣品:注意:我test.csv文件大約60MBValueError異常:無效與基座10字面INT(): '3" 爲 r'

"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文件上做到這一點?

回答

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應顯示預期的輸出。

4

嘗試

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

這將從線串刪除行結束。

更好的解決方案:使用Python的csv模塊爲您處理這些方面。

0

建議csv模塊更有幫助。

例如:的

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

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

和數據給出的

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

輸出其更易於管理。

此外,csv模塊也會寫入csv文件。

相關問題