喜欢Python,我也是Python新手。在社区(像Antti Haapala这样的用户)的帮助下,我能够在某种程度上进行。但最后我陷入困境。请帮忙。在进入我的大数据POC之前,我还有两项任务。 (计划在文本文件中的1百万条记录中使用此代码)
•在列(C#3)中搜索关键词,并在前面和后面保留2个单词。
•将打印输出转移到文件。
•在这里,我不想为了参照完整性目的而触及C#1,C#2。
非常感谢你的帮助。
我的输入文件:
C #1 C # 2 C# 3 (these are headings of columns, I used just for clarity)
12088|CITA|{Hello very nice lists, better to keep those
12089|CITA|This is great theme for lists keep it
所需的输出文件:(仅在第3列或最后一列中更改)
12088|CITA|very nice lists, better to
12089|CITA|theme for lists keep it
我目前正在使用的代码:
s = """12088|CITA|{Hello very nice lists, better to keep those
12089|CITA|This is great theme for lists keep it """
for line in s.splitlines():
if not line.strip():
continue
fields = line.split(None, 2)
joined = '|'.join(fields)
print(joined)
BTW,如果我使用关键词搜索,我正在寻找我的第一和第二列。我的挑战是保持第1和第2列没有变化。并且只搜索第3列并在关键字之后/之前保留2个字。
答案 0 :(得分:1)
首先,我需要警告您,使用此代码进行100万条记录是危险的。你正在处理正则表达式,只要表达式是常规的,这个方法就很好。否则,您最终可能会创建大量案例来提取所需的数据,而无需提取您不想要的数据。
对于100万个案例,你需要大熊猫,因为循环太慢了。
import pandas as pd
import re
df = pd.DataFrame({'C1': [12088
,12089],'C2':["CITA","CITA"],"C3":["Hello very nice lists, better to keep those",
"This is great theme for lists keep it"]})
df["C3"] = df["C3"].map(lambda x:
re.findall('(?<=Hello)[\w\s,]*(?=keep)|(?<=great)[\w\s,]*',
str(x)))
df["C3"]= df["C3"].map(lambda x: x[0].strip())
df["C3"].map(lambda x: x.strip())
给出了
df
C1 C2 C3
0 12088 CITA very nice lists, better to
1 12089 CITA theme for lists keep it
答案 1 :(得分:0)
关于您是如何努力执行关键字搜索,仍然存在一些问题。您的示例中已经包含一个障碍:如何处理逗号等字符?此外,还不清楚如何处理不包含关键字的行。另外,如果关键字之前没有两个单词或两个单词后该怎么办?我猜你自己对确切的要求有些不确定,并没有考虑所有边缘情况。
然而,我做了一些盲目的决定&#34;关于这些问题,这是一个简单的示例实现,假设您的关键字匹配规则相当简单。我创建了函数findword()
,您可以将其调整为您喜欢的任何内容。所以,也许这个例子可以帮助你找到自己的要求。
KEYWORD = "lists"
S = """12088|CITA|{Hello very nice lists, better to keep those
12089|CITA|This is great theme for lists keep it """
def findword(words, keyword):
"""Return index of first occurrence of `keyword` in sequence
`words`, otherwise return None.
The current implementation searches for "keyword" as well as
for "keyword," (with trailing comma).
"""
for test in (keyword, "%s," % keyword):
try:
return words.index(test)
except ValueError:
pass
return None
for line in S.splitlines():
tokens = line.split("|")
words = tokens[2].split()
idx = findword(words, KEYWORD)
if idx is None:
# Keyword not found. Print line without change.
print line
continue
l = len(words)
start = idx-2 if idx > 1 else 0
end = idx+3 if idx < l-2 else -1
tokens[2] = " ".join(words[start:end])
print '|'.join(tokens)
测试:
$ python test.py
12088|CITA|very nice lists, better to
12089|CITA|theme for lists keep it
PS:我希望我的指数适合切片。不过,你应该检查一下。