我的 python 脚本在执行时将值打印到打开它的 excel 文档的单个列
My python script when executed prints values to a single column of the excel document in which it is opened
我一直在尝试在执行简单检查后将行从 csv(逗号分隔)复制到另一个 csv 文件。但是,新创建的输出恰好在一列中。我怎样才能解决这个问题?我已经尝试使用 excel 中的文本解决方案迁移值,但没有取得积极成果。我在块引号中提供的是一个样本 csv 输入,它位于 ~400mb 文件中,如果条件满足第二个文件,则在复制之前需要针对给定条件读取该文件。
"Glyma0022s00420.1,1932,1932,1,5.397348971,9.108346736,13.06778834,13.60298787,0.77651741,0.117442453,11.76078538,8.366009655,10.94107876,12.25047115,0.985502816,0.938466273,11.36138317,9.161105262,15.77093455,14.41819843,0.727405702,0.019170303,12.43972822,16.69100507,0.714607056,0.403279462,""osi,rcom,"",gi|225423945|ref|XP_002279093.1| PREDICTED: hypothetical protein [Vitisvinifera],No hit,""tr|B9ST04|B9ST04_RICCO DNA binding protein,>putative OS=Ricinus communisGN=RCOM_0353100 PE=4 SV=1"",""PF01426,PF05641"",None,None,None,None,AT1G68580.1,None,agenet domain-containing protein / bromo-adjacent homology (BAH) domain-containing protein,PF01426|PF05641 BAH domain|Agenet domain
这将是示例输入
#!/usr/bin/env
import csv
from sys import argv
script, filename = argv
def pvalueselection(file_in, file_out):
header = True
for line in file_in:
line_split = line.split(',')
if(header):
file_out.writerow([line])
header = False
continue
else:
if float(line_split[9]) <=0.05 or float(line_split[15])<=0.05 or float(line_split[21]) <=0.05 or float(line_split[25])<=0.05:
file_out.writerow([line])
def main():
file_in = open(filename, 'rb')
file_out = open ("output.csv",'wb')
csv_out = csv.writer(file_out,dialect='excel',delimiter=',')
pvalueselection(file_in,csv_out)
file_in.close()
file_out.close()
if __name__ == '__main__': main()
你的代码看起来不错。
为什么说它只在一栏中打开呢?
这可能是 excel 中的默认分隔符(我猜默认情况下是 space/tab)。
打开 excel 中的 csv 并转到数据->文本到列,select 'comma' 作为分隔符,然后按完成。
代码好像没问题。
你可以试试改成:
csv_out = csv.writer(file_out,dialect='excel',delimiter='\t')
或其他分隔符,例如';'
file_out.writerow([line])
将创建一个只有一个元素的列表
例如
In [1]: test = "1,2,3,4,5,6,7"
In [2]: list_test = [test]
Out[2]: ['1,2,3,4,5,6,7']
In [6]: len(list_test)
Out[6]: 1
您需要的是一个由定界符分隔的元素的列表。在你的代码中使用 line.split(",")
之后的列表会 return 这样的列表,使用拆分将解决问题,例如在下面的代码中
In [1]: test = "1,2,3,4,5,6,7"
In [2]: list_test = test.split(",")
In [3]: print list_test
out: ['1', '2', '3', '4', '5', '6', '7']
#now use the writerow method to write the list
file_out.writerow(list_test)
参考文档有更多关于用法的例子
https://docs.python.org/3/library/csv.html
我一直在尝试在执行简单检查后将行从 csv(逗号分隔)复制到另一个 csv 文件。但是,新创建的输出恰好在一列中。我怎样才能解决这个问题?我已经尝试使用 excel 中的文本解决方案迁移值,但没有取得积极成果。我在块引号中提供的是一个样本 csv 输入,它位于 ~400mb 文件中,如果条件满足第二个文件,则在复制之前需要针对给定条件读取该文件。
"Glyma0022s00420.1,1932,1932,1,5.397348971,9.108346736,13.06778834,13.60298787,0.77651741,0.117442453,11.76078538,8.366009655,10.94107876,12.25047115,0.985502816,0.938466273,11.36138317,9.161105262,15.77093455,14.41819843,0.727405702,0.019170303,12.43972822,16.69100507,0.714607056,0.403279462,""osi,rcom,"",gi|225423945|ref|XP_002279093.1| PREDICTED: hypothetical protein [Vitisvinifera],No hit,""tr|B9ST04|B9ST04_RICCO DNA binding protein,>putative OS=Ricinus communisGN=RCOM_0353100 PE=4 SV=1"",""PF01426,PF05641"",None,None,None,None,AT1G68580.1,None,agenet domain-containing protein / bromo-adjacent homology (BAH) domain-containing protein,PF01426|PF05641 BAH domain|Agenet domain
这将是示例输入
#!/usr/bin/env
import csv
from sys import argv
script, filename = argv
def pvalueselection(file_in, file_out):
header = True
for line in file_in:
line_split = line.split(',')
if(header):
file_out.writerow([line])
header = False
continue
else:
if float(line_split[9]) <=0.05 or float(line_split[15])<=0.05 or float(line_split[21]) <=0.05 or float(line_split[25])<=0.05:
file_out.writerow([line])
def main():
file_in = open(filename, 'rb')
file_out = open ("output.csv",'wb')
csv_out = csv.writer(file_out,dialect='excel',delimiter=',')
pvalueselection(file_in,csv_out)
file_in.close()
file_out.close()
if __name__ == '__main__': main()
你的代码看起来不错。 为什么说它只在一栏中打开呢? 这可能是 excel 中的默认分隔符(我猜默认情况下是 space/tab)。
打开 excel 中的 csv 并转到数据->文本到列,select 'comma' 作为分隔符,然后按完成。
代码好像没问题。
你可以试试改成:
csv_out = csv.writer(file_out,dialect='excel',delimiter='\t')
或其他分隔符,例如';'
file_out.writerow([line])
将创建一个只有一个元素的列表
例如
In [1]: test = "1,2,3,4,5,6,7"
In [2]: list_test = [test]
Out[2]: ['1,2,3,4,5,6,7']
In [6]: len(list_test)
Out[6]: 1
您需要的是一个由定界符分隔的元素的列表。在你的代码中使用 line.split(",")
之后的列表会 return 这样的列表,使用拆分将解决问题,例如在下面的代码中
In [1]: test = "1,2,3,4,5,6,7"
In [2]: list_test = test.split(",")
In [3]: print list_test
out: ['1', '2', '3', '4', '5', '6', '7']
#now use the writerow method to write the list
file_out.writerow(list_test)
参考文档有更多关于用法的例子 https://docs.python.org/3/library/csv.html