Python 在不更改文本文件的情况下更改值
我正在编写一个程序,该程序应该返回最小的序列比对分数(越小=越好),它与Coursera样本输入一起工作,但对于我们提供的数据集,我无法手动输入序列,因此我不得不求助于使用文本文件。有几件事我觉得很奇怪。 首先,Python 在不更改文本文件的情况下更改值,python,file,loops,text,iteration,Python,File,Loops,Text,Iteration,我正在编写一个程序,该程序应该返回最小的序列比对分数(越小=越好),它与Coursera样本输入一起工作,但对于我们提供的数据集,我无法手动输入序列,因此我不得不求助于使用文本文件。有几件事我觉得很奇怪。 首先, pattern = 'AAA' DNA = open('practice_data.txt') empty = [] for lines in DNA: line=lines.strip().strip('\n') empty.append(line)
pattern = 'AAA'
DNA = open('practice_data.txt')
empty = []
for lines in DNA:
line=lines.strip().strip('\n')
empty.append(line)
print(empty)
print(smallest_distance(pattern, DNA))
如果我运行这个,我的程序输出0。如果我注释掉循环,我的程序输出2。我没有改变DNA,为什么我的程序会有不同的表现呢?另外,我的strip('\n')正在工作(出于某种原因,strip('n')也可以工作),但我的strip()不工作。一旦我弄明白了这一点,我就可以在我的最小距离函数中测试空
以下是我的数据:
ACTAG
CTTAGTATCACTCTGAAAAGAGATTCCGTATCGATGACCGCCAGTTAATACGTGCGAGAAGTGGACACGGCCGCCGACGGCTTCTACACGCTATTACGATG AACCAACAATTGCTCGAATCCTTCCTCAAAATCGCACACGTCTCTCTGGTCGTAGCACGGATCGGCGACCCACGCGTGACAGCCATCACCTATGATTGCCG
TTAAGGTACTGCTTCATTGATCAACACCCCTCAGCCGGCAATCACTCTGGGTGCGGGCTGGGTTTACAGGGGTATACGGAAACCGCTGCTTGCCCAATAAT
etc...
写:
pattern = 'AAA'
DNA = open('practice_data.txt').read().splitlines()
newDNA = []
for line in DNA:
newDNA += line.split() # create an array with strings then concatenate it with the newDNA array
print(smallest_distance(pattern, newDNA))
潜在错误:
print(smallest_distance(pattern, DNA))
DNA是文件描述符,不是字符串数组。因为DNA=open('practice\u data.txt')
因为循环消耗DNA。所以,如果您在最小距离处再次使用for loop来处理DNA中的行:
,则它不起作用
更新:
在这种情况下,for循环从文件的开头一直到结尾。它不会像列表一样再次返回。除非调用DNS.close()
并再次初始化文件描述符DNA=open('practice\u data.txt')
一个简单的例子,你可以试试
DNA = open('text.txt')
for lines in DNA:
line=lines.strip().strip('\n')
print (line) # print everything in the file here
print ('try again')
for lines in DNA:
line=lines.strip().strip('\n')
print (line) # will not print anything at all
print ('done')
阅读了解更多详细信息解决方案:
pattern = 'AAA'
with open('practice_data.txt') as f_dna:
dna_list = [sequence for line in f_dna for sequence in line.split()]
print(smallest_distance(pattern, dna_list))
说明:
pattern = 'AAA'
with open('practice_data.txt') as f_dna:
dna_list = [sequence for line in f_dna for sequence in line.split()]
print(smallest_distance(pattern, dna_list))
你已经接近解决方案了,但你需要重新定位
->strip()。
但是由于\n
位于行的末尾,split将自动删除它,因为它被计为定界符
e、 g
现在,由于split返回一个列表,您必须通过在列表操作之间进行简单的加法来remplace.append()
DNA = open('practice_data.txt')
empty = []
for lines in DNA:
line = lines.split()
empty += line
但是您的代码中仍然存在一些问题:
最好在打开文件时使用该语句,因为它会自动处理异常并在最后关闭文件描述符:
empty = []
with open('practice_data.txt') as DNA:
for lines in DNA:
line = lines.split()
empty += line
您的代码现在很好,您仍然可以使用列表理解进行重构(在python中非常常见)
如果你很难理解这一点;尝试用for循环重新组合它
empty = []
with open('practice_data.txt') as DNA:
for line in DNA:
for sequence in line.split():
empty.append(sequence)
注意:@MrGeek解决方案可行,但有两个主要默认设置:
- 由于未使用
with
语句,因此该文件从未关闭,导致内存问题
- 使用
.read().splitlines()
将文件的所有内容加载到内存中,如果文件太大,这可能导致内存错误
异常
更进一步,处理大文件:
pattern = 'AAA'
with open('practice_data.txt') as f_dna:
dna_list = [sequence for line in f_dna for sequence in line.split()]
print(smallest_distance(pattern, dna_list))
现在想象一下,如果你有一个1GO的文件,里面装满了DNA序列,即使你没有将所有的文件加载到内存中,你仍然有一个巨大的dict
,更好的做法是为结果创建另一个文件,并动态处理你的DNA:
e、 g
警告:您必须确保您的函数最小距离
接受字符串
,而不是列表
DNA = open('practice_data.txt')
empty = []
for lines in DNA:
line = lines.split()
empty += line
如果不可能,您可能需要处理批处理,但由于它有点复杂,我将不在这里讨论
现在,您可以使用Genator函数进行一些重构,以提高可读性
def extract_sequence(file, pattern):
for line in file:
for sequence in line.split():
yield smallest_distance(pattern, sequence)
pattern = 'AAA'
with open('practice_data.txt') as f_dna, open('result.txt', 'w') as f_result:
for result in extract_sequence(f_dna, pattern):
f_result.write(result)
请给出练习_data.txt。你可以在gist.github.com上发帖,并在这里给我们链接。
的循环消耗DNA
。如果你把它注释掉,它就不会。这可能会对最小距离(模式,DNA)
调用产生影响。我尝试了这一点,由于某种原因,我的列表中只有两个字符串。一个用于第一行,一个用于REST。empty在这里扮演什么角色?我想创建一个文本文件中所有字符串的列表,而不必手动输入它们。一行上可能有多个字符串。如果字符串在一行上,它们是如何分开的?我一直听到“consumes”这个词。你这是什么意思?消耗系统内存?感谢您提供的资源在此上下文中,“消耗”只是指“一行一行地从文件中读取,直到读取整个文件”。精彩的解释!感谢您花时间解释为什么即使某些方法在获得答案时有效,但它们不应用于其他原因。是的,我确实理解列表的理解,但无论如何还是要感谢您的透彻@DrJessop,这也是对我来说的,在编写嵌套列表理解之前,我总是先做循环的for
s,然后再重构^^^无论如何,我很高兴你喜欢这个解释!