*请注意我是Python新手....
我正在尝试为大型CSV文件编写脚本。我的目的是搜索(如grep)CSV的第二列,查找包含字符串的复杂短语,后跟一个特殊字符然后整数,例如“Mainbalance-7-0”或“Mainbalance-8-0”
字符串始终是'Mainbalance'。
特殊字符总是“ - ”。
整数变化。
如果找到短语,我想将整行输出到新的csv文件。
我在这里查看了其他答案,但无法找到具体内容。
输入看起来像:
BAL,04,PSMS-5-13,0,斗,WORD
BAL,03,Mainbalance-6-0,36,MAIN,WORD
BAL,020,PLUSC-122-0,36,MAIN,WORD
BAL,05,Mainbalance-7-0,36,MAIN,WORD
输出为:
BAL,03,Mainbalance-6-0,36,MAIN,WORD
BAL,05,Mainbalance-7-0,36,MAIN,WORD
我试过以下......
with open("D:/Temp/input.csv", 'rb') as f, open('D:/Temp/output.csv','wb') as outf:
writer = csv.writer(outf, delimiter=',')
reader = csv.reader(f)
for line in f:
if 'Mainbalance*' in line:
writer.writerow(line)
使用创建的文件打印NO结果。
您应该迭代reader
对象,正如斯蒂芬在评论中指出并检查每行的第三列。然后,如果检查以Mainbalance
开头的列值是否足够可靠,则可以使用str.startswith()
:
for line in reader:
if line[2].startswith("Mainbalance"):
writer.writerow(line)
或者,如果需要更详细的检查,我们可以创建一个正则表达式模式,如Mainbalance-\d+-\d+
,其中\d+
将匹配一个或多个数字:
import re
# ...
pattern = re.compile(r"Mainbalance-\d+-\d+")
for line in reader:
if pattern.match(line[2]):
writer.writerow(line)
代码不起作用,因为'Mainbalance *'不是正则表达式
if 'Mainbalance*' in line: # resolves to false, as * is not in the string.
删除星号更改代码,然后代码工作。
if 'Mainbalance' in line: # star is removed