如何使用 Python 在指定的分隔符后查找和替换/删除文本?
Posted
技术标签:
【中文标题】如何使用 Python 在指定的分隔符后查找和替换/删除文本?【英文标题】:How to find and replace/remove text after a specified delims with Python? 【发布时间】:2015-03-29 15:36:40 【问题描述】:我有一个 40GB 文本文件,其中包含以下行:
55655653:foo
6654641:balh2
我编写了一个批处理脚本来查找和替换/删除 :foo 并且只保留之前的数字。
批处理脚本:
@echo on
((for /f "tokens=1 delims=:" %%b in (C:\data.txt) do ( echo %%b)) >C:\dataFinal.txt
)
pause
batch的问题是无法读取40GB的大文件
所以我决定编写 Python 代码来做同样的事情:
f1 = open('data.txt', 'r')
f2 = open('dataFinal.txt', 'w')
for line in f1:
f2.write(line.replace(':', ''))
f1.close()
f2.close()
我在这里缺少的是如何指定要删除的:之后的文本,对于批处理文件,它是 tokens=1 delims=:
请注意文件大小
我已经使用 Java 代码生成了 40GB 的文件(也许这些信息可以帮助我们):
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF8"));
while (in.ready())
String line = in.readLine();
PrintStream out = new PrintStream(System.out, true, "UTF-8");
out.println(initializeKeyPair(line).toString() + ":" + line );
【问题讨论】:
Python string.replace regular expression 的可能重复项 你在谈论 Windows 吗? 如果您是通过 Java 代码创建的 - 为什么不重新运行它并删除+ ": " + line
?
@Jon Clements 我需要两个文件副本,一个带有 Number:Text,另一个只有 Number,生成此文件大约需要 4 天。我刚刚意识到我可以添加另一个 PrintStream 以仅保存 initializeKeyPair(line).toString() (the Number) ,所以它会写入两个文件,但现在为时已晚。
【参考方案1】:
你应该使用 line.split():
>>> line = '55655653:foo'
>>> line, _ = line.split(':', 1)
>>> print(line)
55655653
请注意,这也会减少拖尾 '\n',因此您应该手动添加它(或使用打印)。此外,这样的line, _ = line.split(':', 1)
可能会引发:
不在行中的异常。
所以你的代码应该是这样的:
f1 = open('data.txt', 'r')
f2 = open('dataFinal.txt', 'w')
for line in f1:
line, _ = line.split(':', 1)
f2.write(line + '\n')
f1.close()
f2.close()
(请注意,Jon Clements 提供了更漂亮的文件处理方式)。
【讨论】:
谢谢,我如何编辑代码以从文件中读取?我已经用 f2.write(line, _ = line.split(':', 1)) 编辑了这个 f2.write(line.replace(':', '')) 但错误说: f2.write(line , _ = line.split(':', 1)) TypeError: write() 没有关键字参数 这段代码也有效,但与 Jon Clements 提供的一样,它只写入了 140KB 的文件。【参考方案2】:您可以使用str.partition
拆分第一个:
之前的数字
with open('data.txt') as fin, open('dataFinal.txt', 'w') as fout:
fout.writelines(line.partition(':')[0] + '\n' for line in fin)
我们在这里没有使用with
,因此文件会自动关闭,并且生成器表达式会循环fin
拆分行,占用第一个:
,然后将其写回fout,并附加一个换行符。
您可能希望指定编码:
import io
with io.open('/usr/share/dict/words', encoding='utf-8') as fin, io.open('dataFinal.txt', 'w', encoding='utf-8') as fout:
fout.writelines(line.partition(':')[0] + '\n' for line in fin)
【讨论】:
谢谢,这段代码有效,但是它只写了原来 40GB 文件的 140kb,也许这不能读取大文本文件? @xhxx 文件中有二进制数据吗?像 EOF 标记?你可能想试试open('data.txt', 'rb')
看看会发生什么......
open('data.txt', 'rb') 给出了相同的结果,该文件包含许多不同的字符和编码(中国、韩国、法国字母++,您能想到的所有键盘符号)文本文件是 UTF-8
@xhxx from itertools import islice
然后使上面的行结束 for line in islice(fin, 7000)
@xhxx 试试这个编码的版本【参考方案3】:
您可以使用此方法通过批处理文件轻松处理任意大小的数据文件:
@echo off
rem Use a subroutine to read from C:\data.txt and write to C:\dataFinal.txt
rem the subroutine must be in a separate .bat file and must be called via CMD.EXE
cmd /C call ProcessFile.bat < C:\data.txt > C:\dataFinal.txt
pause
这是 ProcessFile.bat:
@echo off
setlocal EnableDelayedExpansion
rem Process lines of input file in an endless loop
for /L %%i in ( ) do (
rem Read next line and check for EOF
set "line="
set /P "line="
if not defined line exit /B
rem Process line read
for /F "delims=:" %%b in ("!line!") do echo %%b
)
请注意,此方法在第一个空行处结束读取输入文件,但如果需要,此点可能会被修复。
【讨论】:
谢谢,已标记最佳答案,将保留以备将来使用。 见here(以上7个回答)...以上是关于如何使用 Python 在指定的分隔符后查找和替换/删除文本?的主要内容,如果未能解决你的问题,请参考以下文章