在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崩溃时,它会冻结。关于如何克服这个问题的任何建议?
答案 0 :(得分:1)
您应该做的是将文件分成两个单独的文件。你的逻辑应该做这样的事情:
将文件拆分为两部分后,可以将它们一起迭代:
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提供的高级函数更困难(你需要编写在角色级别运行的代码),但正如你所看到的那样,付出代价是值得的。高级职能。