使用Python在文本文件中查找和替换

19
我有一个大约有400,000行的文本文件。我需要将此文本文件导入到仅接受使用空格或制表符分隔的文本文件的程序中,但是这个文本文件是用分号分隔的。在我正在导出文本文件的程序(Arcmap)中没有更改分隔符的选项,在文本文件中进行查找和替换的工作会花费两天的时间。
我已经搜索了一个脚本来完成这个任务,但它们似乎都会用空格替换整个单词文件的行,而不是逐个替换每个分号,这让我最终得到一个空的文本文件。
以下是我的文本文件样例:
"OID_";"POINTID";"GRID_CODE";"POINT_X";"POINT_Y"
;1;-56.000000;200900.250122;514999.750122
;2;-56.000000;200900.750122;514999.750122
;3;-56.000000;200901.250122;514999.750122
;4;-57.000000;200901.750122;514999.750122
;5;-57.000000;200902.250122;514999.750122
;6;-57.000000;200902.750122;514999.750122
;7;-57.000000;200903.250122;514999.750122
;8;-57.000000;200903.750122;514999.750122
;9;-57.000000;200904.250122;514999.750122
;10;-57.000000;200904.750122;514999.750122

我需要它看起来像这样:

1 -56.000000 200900.250122 514999.750122
2 -56.000000 200900.750122 514999.750122

Alice,请编辑您的问题以显示(1)文件的前几行(2)修复后这些行应该是什么样子。我相当确定我们可以帮助您,但我们需要确切地知道您需要做什么。此外,Python 2.x还是3.x? - John Machin
我需要一个Python解决方案,因为在记事本中使用“查找替换全部”功能会导致我的计算机崩溃! - Alice Duff
Alice,请回答:Python 2.X 还是 3.X?请另外开一个问题来询问文件重命名问题(并从此问题中删除它)。 - John Machin
Alice,我对那个文件结构非常怀疑。请打开命令提示符窗口(我假设你正在使用Windows),并运行以下命令 ===>>> c:\wherever\python25 -c "print repr(open('your.file, 'rb').read(300))" <<<=== 这将打印文件的前300个字节的明确表示,以便我们可以准确地查看其中的内容。请仔细复制/粘贴输出文本(不是屏幕截图)到您的问题编辑中。 - John Machin
是的,它只是无法读取并抛出错误!我不认为每行有两个记录,每行表示一个点,它具有一个数字、一个Z值、一个X和一个Y值!哈哈!我没有任何其他类型文件的经验,所以我猜它看起来对我很正常! - Alice Duff
显示剩余7条评论
3个回答

33
这怎么样:
sed -i 's/;/ /g' yourBigFile.txt

这不是Python解决方案。你需要在shell中启动它。但是,如果你使用记事本,我猜你在使用Windows。所以这里有一个Python解决方案:

f1 = open('yourBigFile.txt', 'r')
f2 = open('yourBigFile.txt.tmp', 'w')
for line in f1:
    f2.write(line.replace(';', ' '))
f1.close()
f2.close()

我只需要把这个直接复制到Python里吗?我需要在它前面写任何东西吗?(对不起,我完全没用!) - Alice Duff
@Alice,我已经为你添加了一个Python解决方案。 - eumiro
我收到了错误信息:Message File Name Line Position Traceback
<module> C:\Documents and Settings\DuffA\Mijn documenten\Downloads\search_replace.py 6
AttributeError: 'file' object has no attribute 'replace'
- Alice Duff
这个更好:http://stackoverflow.com/questions/25940101/removing-lines-from-a-csv-with-python-also-adds-an-extra-line?noredirect=1#comment40610727_25940101 - maudulus

21

你可以使用Python中的fileinput

import fileinput
for line in fileinput.FileInput("file",inplace=1):
    line = line.replace(";"," ")
    print line,

这将会直接把所有的 ";" 替换成空格。


2
这会在Windows中为我添加每行额外的换行符。 - satnhak
1
@TheMouthofaCow - 我已经建议了一个编辑来解决那个问题。 - Mark Booth
这解决了额外的行问题:http://stackoverflow.com/questions/25940101/removing-lines-from-a-csv-with-python-also-adds-an-extra-line?noredirect=1#comment40610727_25940101 - maudulus

4

Python 3.2已经增加了使用此功能作为上下文管理器的能力,因此无论何种原因导致在处理过程中出现失败,文件都将始终关闭:

import fileinput
def main():
    with fileinput.input(inplace=True) as f:
        for line in f:
            line = line.replace(";", " ")
            print(line, end='')

使用它,只需提供您想处理的文本文件即可。

(灵感来源)


这行代码是做什么的?print(line, end='') - David Doria
在行末插入一个空字符串,而不是通常的\n字符。 - tshepang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接