我有一个以下格式的文本文件:
('1', '2')
('3', '4')
.
.
.
我想让它看起来像这样:
1 2
3 4
etc...
我一直在尝试使用python中的re模块执行此操作,将re.sub命令链接在一起,如下所示:
for line in file:
s = re.sub(r"\(", "", line)
s1 = re.sub(r",", "", s)
s2 = re.sub(r"'", "", s1)
s3 = re.sub(r"\)", "", s2)
output.write(s3)
output.close()
在我接近输出文件的末尾之前似乎工作得很好;然后它变得不一致并停止工作。我认为这是因为我正在处理的文件的大小; 300MB或大约1200万行。
任何人都可以帮我确认我的内存不足吗?或者如果是别的什么?合适的替代方案,或解决方法?
答案 0 :(得分:2)
您可以使用更简单的正则表达式来简化您的代码,该正则表达式可以找到输入中的所有数字:
import re
with open(file_name) as input,open(output_name,'w') as output:
for line in input:
output.write(' '.join(re.findall('\d+', line))
output.write('\n')
答案 1 :(得分:1)
为什么不将它们加载为ast.literal_eval
的python元组。另外,不是手动打开和关闭文件,而是可以使用with
语句来关闭块末尾的文件:
With open(file_name) as input,open(output_name,'w') as output:
for line in input:
output.write(','.join(ast.literal_eval(line.strip())))
答案 2 :(得分:1)
我会使用namedtuple来获得更好的效果。代码变得更具可读性。
# Python 3
from collections import namedtuple
from ast import literal_eval
#...
Row = namedtuple('Row', 'x y')
with open(in_file, 'r') as f, open(out_file, 'w') as output:
for line in f.readlines():
output.write("{0.x} {0.y}".
format(Row._make(literal_eval(line))))
答案 3 :(得分:0)
这是没有re模块的一种方法:
in_file = open(r'd:\temp\02\input.txt', 'r')
out_file = open(r'd:\temp\02\output.txt', 'w')
for line in in_file:
out_file.write(line.replace("'", '').replace('(', '').replace(', ', ' ').replace(')', ''))
out_file.close()