帮助使用python从文本文件中删除项目

帮助使用python从文本文件中删除项目,python,memory,Python,Memory,在我的中实施了一些解决方案后,我提出了以下解决方案: reader = open('C://text.txt') writer = open('C://nona.txt', 'w') counter = 1 names, nums = [], [] row = reader.read().split(' ') x = len(row)/2 for (a, b) in [(c, d) for c, d in zip(row[:x], row[x:]) if d!='na']:

在我的中实施了一些解决方案后,我提出了以下解决方案:

reader = open('C://text.txt') 
writer = open('C://nona.txt', 'w')
counter = 1    
names, nums = [], []    
row = reader.read().split(' ')
x = len(row)/2
for (a, b) in [(c, d) for c, d in zip(row[:x], row[x:]) if d!='na']:
    print counter
    counter +=1
    names.append(a)
    nums.append(b)

writer.write(' '.join(names))
writer.write(' ')
writer.write(' '.join(nums))

该程序对于较小的样本数据集非常有效。但是,当我使用完整的数据集时,它会冻结,并导致python崩溃。关于如何克服这一问题,您有什么建议吗?

您的文件以一种不幸的方式组织起来进行Python处理

请注意,当您调用
reader.read()
时,您正在将整个文件读入内存。假设这占用X字节

调用
split
将有效地增加X字节的内存使用量,因为它将为文件中的每个单独字符串创建一个新字符串

然后调用
行[:x]
行[x:][/code>,这将添加另一个x字节(因为slice操作符复制)

然后调用zip,并创建一个列表,等等。字符串和元组是不可变的数据,这意味着您总是从头开始创建它们

我会在较低的层次上处理这个问题。打开一个文件描述符并将其指向文件的开头。打开另一个,让它查找(na/0/1/2)值的开头(通过计算空格,您将知道这是在哪里)。现在,一次读取一个名称和一个值,如果该值不是“na”,则可以将该名称写入输出文件。如果还需要将值写入输出文件,请将它们保存在内存中,并在完成后一次性写入所有值


不幸的是,这比仅仅使用Python提供的高级函数(您需要编写在字符级运行的代码)更难编写代码,但正如您所看到的,这些高级函数是要付出代价的。

您应该做的是将文件分为两个单独的文件。你的逻辑应该是这样的:

  • 打开数据文件
  • 打开名称文件
  • 读取下一个数据
  • 它叫什么名字?见第5条。否则见第6条
  • 将名称写入名称文件,请参见3
  • 是数字还是na?关闭名称文件并打开编号文件
  • 读取下一个数据
  • 是数字还是na?参见7,否则写入文件
  • 将文件分为两部分后,可以一起迭代:

    names = open('names.txt')
    numbers = open('numbers.txt')
    
    for name, number in zip(names, numbers):
       if not numbers == 'na':
           output.write(name + " " + number)
    

    或者您可以写入两个不同的文件,然后根据需要将它们连接在一起。

    请在Python崩溃时发布stacktrace。它是否内存不足?您可以让python将其分解并导出到10-20个临时文件中,然后调用脚本来处理每个临时文件。如果您的计算机有多个内核,这也会进行“多线程处理”。您是否考虑过将数据转换为更标准的格式,如csv并从那里使用它?当然,返回并接受您之前问题的答案。因为他的数据似乎是一个巨大的名称列表,后面是一个巨大的数字列表,他甚至可以在一个好的文本编辑器中进行拆分。还值得注意的是,这种方法要求名称和数字将每个名称/数字放在单独的一行中。是否有?记事本++是一个简单的初学者。我个人使用Vim(www.Vim.org),它有一个非常陡峭的学习曲线,但一旦你把它弄下来,它会非常有用。