将csv文件作为整数列表打开

1 投票
2 回答
3858 浏览
提问于 2025-04-17 15:00

我刚开始学习Python,想自己摸索一下。我有一个文件,里面有一堆数字,我想把这些数字“导入”到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 个回答

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")
1

如果输入的数据都是在同一行,用逗号隔开的,比如说 500,1000,10000,你可以用下面的方式来读取:

SNP = next(DataReader)

如果输入的数据每个在不同的行上,那就用这个:

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

无论哪种方式,都会把 SNP 设置成一个数字列表,比如 [500, 1000, 15000],然后你就可以对这个列表进行遍历操作。

撰写回答