打开csv作为整数列表

时间:2013-02-06 18:38:12

标签: python csv integer

我是一个尝试自学Python的新手。我有一个包含大量数字的文件,我想" import"它们作为整数进入python列表(或者至少是我认为我想要做的事情)。我似乎遇到了问题,但我不明白它是什么。以下是我的问题以及我尝试过的代码的一些详细信息:

我有一个DNA序列(例如一串约150,000个字母),我想让python进入该字符串中的某个位置,然后在该位置的左侧打印150个字母,该位置的字母方括号包围,然后在该位置右侧150个字母。我需要在字符串中的> 100个位置执行此操作。我在一个单独的文件中列出了这些职位。我已经发现Biopython有一个对象可以为我处理非常长的字符串,如果我告诉python我想要什么位置(例如手动分配),我可以切割这个字符串并获得正确的输出。现在我希望能够从这个其他文件导入我的目标位置,然后让python迭代地浏览该列表并将输出打印到另一个文件。第一部分是我遇到麻烦的地方。

我尝试过几种不同格式的输入文件。一个像这样:

500,1000,15000

另一个像这样(所有位置分开):

500

1000

15000

基于我读过的其他一些帖子,我尝试了几件事。这是一个:

from Bio import SeqIO
import csv

with open('Results.fa', 'a') as f1:
    Reference = SeqIO.read("GEO5FinalAssembly2SC.fa", "fasta") # Biopython
    DataFile = open('TestFile.csv', 'r')
    DataReader = csv.reader(DataFile)
    SNP = []
    for row in DataReader:
        SNP.append(row)
    for i in SNP:
        IA=i-151  #Creating the intervals
        IB=i-1
        JA=i+1
        JB=i+151
        Fragment = Reference.seq[IA:IB] + "[" + Reference.seq[i] + "]" + Reference.seq[JA:JB]
        F = str(Fragment)      #Need to turn Fragment into a string that can be written
        header = ">MINT_SNP" + str(i) + "\n"
        f1.write(header)
        f1.write(F)
        f1.write("\n")

这将返回错误:

Traceback (most recent call last):
  File "./ReferenceSplitter3.py", line 15, in <module>
    IA=i-151  #Creating the intervals
TypeError: unsupported operand type(s) for -: 'list' and 'int'

我也试过这个:

from Bio import SeqIO
import csv

with open('Results.fa', 'a') as f1:
    Reference = SeqIO.read("GEO5FinalAssembly2SC.fa", "fasta")
    with open('TestFile.txt', 'r') as Input:
        rows = csv.reader(Input, quoting=csv.QUOTE_NONNUMERIC)
        SNP = [[item for number, item in enumerate(row)] for row in rows]       
    for i in SNP:
        IA=i-151  #Creating the intervals
        IB=i-1
        JA=i+1
        JB=i+151
        Fragment = Reference.seq[IA:IB] + "[" + Reference.seq[i] + "]" + Reference.seq[JA:JB]
        F = str(Fragment)      #Need to turn Fragment into a string that can be written
        header = ">SNP" + str(i) + "\n"
        f1.write(header)
        f1.write(F)
        f1.write("\n")

这会产生类似的错误:

Traceback (most recent call last):
  File "./ReferenceSplitter4.py", line 13, in <module>
    IA=i-151  #Creating the intervals
TypeError: unsupported operand type(s) for -: 'list' and 'int'

但是,当我自己定义一个整数列表时,就像这个SNP =(500,1000,1500)一样,它似乎工作正常。我想知道我是否缺少一些基本的python概念。对不起,如果这是一个非常基本的问题,但任何建议都将非常感谢!

2 个答案:

答案 0 :(得分:1)

对于输入,它们都在以逗号(500,1000,10000)分隔的同一行上,您可以使用以下内容读取它:

SNP = next(DataReader)

对于它们各自在不同行上的输入,请执行:

SNP = []
for row in DataReader:
    SNP.append(row[0])

SNP设置为一个数字列表,例如[500, 1000, 15000],然后再迭代。

答案 1 :(得分:1)

如果其他人有兴趣这样做(使用Biopython),这应该有效。下面的脚本将找到SNP周围的侧翼区域。感谢David Robinson提供了有用的建议!

from Bio import SeqIO
import csv

with open('Results.fa', 'a') as f1:
   reference = SeqIO.read("Reference.fa", "fasta")
   datafile = open('TestFile.csv', 'r')
   datareader = csv.reader(datafile)
   positions = next(datareader)
   snp = [int(i) for i in positions] #Convert strings in positions to integers
   for i in snp:
        IA=i-151  #Creating the intervals
        IB=i-1
        JA=i+1
        JB=i+151

        fragment = reference.seq[IA:IB] + "[" + reference.seq[i] + "]" + reference.seq[JA:JB]
        f = str(fragment)      #Need to turn Fragment into a string that can be written
        header = ">SNP" + str(i) + "\n"
        f1.write(header)
        f1.write(f)
        f1.write("\n")