Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在不更改文本文件的情况下更改值_Python_File_Loops_Text_Iteration - Fatal编程技术网

Python 在不更改文本文件的情况下更改值

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)

我正在编写一个程序,该程序应该返回最小的序列比对分数(越小=越好),它与Coursera样本输入一起工作,但对于我们提供的数据集,我无法手动输入序列,因此我不得不求助于使用文本文件。有几件事我觉得很奇怪。 首先,

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,然后再重构^^^无论如何,我很高兴你喜欢这个解释!