【问题标题】:Help removing items from a text file using python帮助使用 python 从文本文件中删除项目
【发布时间】:2010-08-02 15:34:29
【问题描述】:

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

【问题讨论】:

  • 请贴出Python崩溃时的stacktrace。是不是内存不够了?
  • 您可以让 python 将其分解并将其导出为 10 - 20 个临时文件,然后调用一个脚本来处理每个文件。如果您的计算机有多个内核,这也将执行“多线程”。
  • 您是否考虑过将数据转换为更标准的格式,例如 csv 并从那里开始使用?
  • 当然,返回并接受您之前问题的答案。

标签: python memory


【解决方案1】:

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

  1. 打开数据文件
  2. 打开名称文件
  3. 读取下一个数据
  4. 是名字吗?见 5。否则见 6
  5. 将名称写入名称文件,参见 3
  6. 是数字还是na?关闭名称文件并打开数字文件
  7. 读取下一个数据
  8. 是数字还是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)

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

【讨论】:

  • 因为他的数据看起来是一个巨大的名字列表,后面跟着一个巨大的数字列表,他甚至可以在一个好的文本编辑器中进行拆分。还值得注意的是,这种方法要求名称和数字将每个名称/数字放在单独的行上。
  • 其中任何一个? Notepad++ 对于初学者来说是一个简单的工具。我个人使用 Vim (www.vim.org),它的学习曲线非常陡峭,但一旦你掌握了它就会非常有用。
【解决方案2】:

您的文件以一种不适合 Python 处理的方式组织。

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2021-10-27
    相关资源
    最近更新 更多