使用Python逐块切片数据
各位,我有一个大文件,格式如下。数据采用“块”格式。一个包含三行的“块”:时间T、用户U和内容W。 例如,这是一个块:使用Python逐块切片数据,python,line,block,slice,Python,Line,Block,Slice,各位,我有一个大文件,格式如下。数据采用“块”格式。一个包含三行的“块”:时间T、用户U和内容W。 例如,这是一个块: T 2009-06-11 21:57:23 U tracygazzard W David Letterman is good man 因为我将只使用包含特定关键字的块。我将原始海量数据逐块切片,而不是将整个数据转储到内存中。每次读取一个块,如果该行内容包含“bike”一词,则将该块写入磁盘 您可以使用以下两个块来测试脚本 T 2009-06-11 21:57:
T 2009-06-11 21:57:23
U tracygazzard
W David Letterman is good man
因为我将只使用包含特定关键字的块。我将原始海量数据逐块切片,而不是将整个数据转储到内存中。每次读取一个块,如果该行内容包含“bike”一词,则将该块写入磁盘
您可以使用以下两个块来测试脚本
T 2009-06-11 21:57:23
U tracygazzard
W David Letterman is good man
T 2009-06-11 21:57:23
U charilie
W i want a bike
我试着一行一行地做这项工作:
data = open("OWS.txt", 'r')
output = open("result.txt", 'w')
for line in data:
if line.find("bike")!= -1:
output.write(line)
您可以使用正则表达式:
import re
data = open("OWS.txt", 'r').read() # Read the entire file into a string
output = open("result.txt", 'w')
for match in re.finditer(
r"""(?mx) # Verbose regex, ^ matches start of line
^T\s+(?P<T>.*)\s* # Match first line
^U\s+(?P<U>.*)\s* # Match second line
^W\s+(?P<W>.*)\s* # Match third line""",
data):
if "bike" in match.group("W"):
output.write(match.group()) # outputs entire match
重新导入
data=open(“OWS.txt”,“r”).read()#将整个文件读入字符串
输出=打开(“result.txt”,“w”)
对于re.finditer中的匹配(
r“”(?mx)#详细正则表达式,^匹配行的开头
^T\s+(?P.*)\s*#匹配第一行
^U\s+(?P.*)s*#匹配第二行
^W\s+(?P.*)s*#匹配第三行“”,
数据):
如果匹配组(“W”)中的“自行车”:
output.write(match.group())#输出整个匹配
由于块的格式是恒定的,您可以使用列表来保存块,然后查看bike
是否在该块中:
data = open("OWS.txt", 'r')
output = open("result.txt", 'w')
chunk = []
for line in data:
chunk.append(line)
if line[0] == 'W':
if 'bike' in str(chunk):
for line in chunk:
output.write(line)
chunk = []
谢谢,我已经尝试使用for line in data:if line.find(“bike”)!=-1:输出。写(行),这样我可以逐行解决问题,但我不知道如何逐块解决。你不需要给出所有的代码。只是关键部分。每个块中的行是否真正以
T
、U
和W
开头?是的。对于此特定数据。它的格式是这样的。我以前在超链接中尝试过这个脚本,但是它并不简洁。但你也可以参考一下你有没有考虑过记忆的问题将整个文件读入string@FrankWANG:嗯,你的文件有多大?它是26克,不过我可以把它分成更小的。