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

时间:2010-08-02 15:34:29

标签: python memory

previous question中实施了一些解决方案之后,我提出了以下解决方案:

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崩溃时,它会冻结。关于如何克服这个问题的任何建议?

2 个答案:

答案 0 :(得分:1)

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

  1. 打开数据文件
  2. 打开名称文件
  3. 阅读下一个数据
  4. 是名字吗?见5.否则见6
  5. 将名称写入名称文件,参见3
  6. 是号码还是na?关闭名称文件和开放号码文件
  7. 阅读下一个数据
  8. 是号码还是na?见7,否则写文件
  9. 将文件拆分为两部分后,可以将它们一起迭代:

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

    或者您可以写两个不同的文件,然后将它们连接在一起,如果这就是您需要的。

答案 1 :(得分:0)

您的文件以不幸的方式组织进行Pythonic处理。

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

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

然后你调用row[:x]row[x:],这将添加另外X个字节(因为切片运算符会复制)。

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

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

不幸的是,编码比使用Python提供的高级函数更困难(你需要编写在角色级别运行的代码),但正如你所看到的那样,付出代价是值得的。高级职能。