Python 以整数列表的形式打开csv

Python 以整数列表的形式打开csv,python,csv,integer,Python,Csv,Integer,我是一个尝试自学Python的新手。我有一个文件,里面有一堆数字,我想把它们作为整数“导入”到python列表中(或者至少我想这样做)。我似乎有问题,但我不明白是什么问题。以下是有关我的问题和我尝试过的代码的一些详细信息: 我有一个DNA序列(例如,一个大约150000个字母的字符串),我想让python转到该字符串中的某个位置,然后在该位置的左侧打印150个字母,该位置的字母用方括号包围,然后在该位置的右侧打印150个字母。我需要对字符串中>100个位置执行此操作。我在一个单独的文件中列出了这

我是一个尝试自学Python的新手。我有一个文件,里面有一堆数字,我想把它们作为整数“导入”到python列表中(或者至少我想这样做)。我似乎有问题,但我不明白是什么问题。以下是有关我的问题和我尝试过的代码的一些详细信息:

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

我尝试了几种不同格式的输入文件。像这样的人:

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'
这会产生类似的错误:

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'
回溯(最近一次呼叫最后一次):
文件“/ReferenceSplitter4.py”,第13行,在
IA=i-151#创建间隔
TypeError:-:“list”和“int”的操作数类型不受支持

然而,当我自己定义一个整数列表时,比如SNP=(50010001500),它似乎工作得很好。我想知道我是否遗漏了一些基本的python概念。很抱歉,如果这是一个非常基本的问题,但任何建议将不胜感激

对于输入,如果它们都在同一行上,并用逗号分隔(
500100010000
),您可以使用以下命令读入:

SNP = next(DataReader)

对于每一行上的输入,请执行以下操作:

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

这两种方法都会将
SNP
设置为一个数字列表,比如
[500、1000、15000]
,然后您就可以进行迭代。

如果其他人有兴趣这样做(使用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")

SNP
是一个行列表,意思是一个列表列表。它看起来像
[[1,2,3],[4,5,6]
也许您想将输入数据平铺到一个类似
[1,2,3,4,5,6]
的列表中?此外,您缺少命名约定会让人感到相当困惑。在Python中,最好对变量使用
snake\u case
,对类使用
CamelCase
。(第三方图书馆往往到处都是,因为大多数都是在公约确立之前建立的。)我想知道为什么“SNP”有双方括号,谢谢你指出这是什么意思。很抱歉,还有命名约定,我必须处理这个问题…谢谢你的快速回复。我试过这些东西,但似乎还是没能用。显然,我在写评论方面也很糟糕。我运行了这个DataFile=open('TestFile.csv','r');DataReader=csv.reader(数据文件);SNP=next(DataReader)并得到相同的错误'IA=i-151#创建interval TypeError:-:'str'和'int'的操作数类型不受支持。我也尝试了其他方法并再次得到相同的错误。如果我在这里太过密集,很抱歉。您需要将
I
从字符串转换为int。您可以在for循环的开头将
I=int(I)
转换为,在我的第一个解决方案中将
SNP=map(int,next(DataReader))
转换为我的第二个解决方案中的
SNP.append(int(行[0])
。再次感谢您的帮助!我也知道了!
SNP = []
for row in DataReader:
    SNP.append(row[0])
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")