前言 - 我对Python很陌生,对另一种语言有更多的经验。
我有一个文本文件,其中包含通用(但略有变化)格式的单列字符串列表“./abc123a1/type/1ab2_x_data_type.file.type”
我需要从所有几百行中提取abc123a1和1ab2部分,并将它们放在csv中的两列(a和b列)之下。有时可能有“1ab2_a”和“1ab2_b”,但我只有想要一个1ab2。所以我想抓住“1ab2_a”并忽略所有其他人。
我有正确的正则表达,我认为它会起作用:
tmp = list()
if re.findall(re.compile(r'^([a-zA-Z0-9]{4})_'), x):
tmp = re.findall(re.compile(r'^([a-zA-Z0-9]{4})_'), x)
elif re.findall(re.compile(r'_([a-zA-Z0-9]{4})_'), x):
tmp = re.findall(re.compile(r'_([a-zA-Z0-9]{4})_'), x)
if len(tmp) == 0:
return None
elif len(tmp) > 1:
print "ERROR found multiple matches"
return "ERROR"
else:
return tmp[0].upper()
我正在尝试逐步制作这个脚本并测试一些东西,以确保它有效,但事实并非如此。
import sys
import csv
listOfData = []
with open(sys.argv[1]) as f:
print "yes"
for line in f:
print line
for line in f:
listOfData.append([line])
print listOfData
with open('extracted.csv', 'w') as out_file:
writer = csv.writer(out_file)
writer.writerow(('column a', 'column b'))
writer.writerows(listOfData)
print listOfData
除了列标题之外,仍然没有在csv中获取任何内容,更不用说解析版了!
有没有人有更好的想法或格式我可以做到这一点?一位朋友提到了对glob.glob的调查,但我也没有运气这么做。
答案 0 :(得分:2)
您应该只阅读一次文件:
meteor logs scheduler
一旦有效,你仍然需要使用正则表达式来获取相关数据以放入csv文件
答案 1 :(得分:0)
我不确定你的正则表达式(它很可能不会起作用),但你当前(非正则表达式,简单)代码不起作用的原因是因为 -
with open(sys.argv[1]) as f:
print "yes"
for line in f:
print line
for line in f:
listOfData.append([line])
正如你所看到的那样,你首先遍历文件中的每一行并打印它,它应该没问题,但是在循环结束后,文件指针位于文件的末尾,所以试图再次迭代它,没有产生任何结果。您应该只迭代一次,并同时打印并附加到列表中。示例 -
with open(sys.argv[1]) as f:
print "yes"
for line in f:
print line
listOfData.append([line])
答案 2 :(得分:0)
我认为至少部分问题是以下两个for
循环:
with open(sys.argv[1]) as f:
print "yes"
for line in f:
print line
for line in f:
listOfData.append([line])
第一个print
是f
的所有行,因此除非您先f.seek(0)
并倒回文件,否则没有任何内容可供第二个迭代。
另一种方法就是这样:
with open(sys.argv[1]) as f:
print "yes"
for line in f:
print line
listOfData.append([line])
如果没有多行样本输入数据,很难判断你的正则表达式是否正常。
答案 3 :(得分:0)
您确定需要所有正则表达式吗?您似乎正在解析路径和文件名列表。可以使用split
命令拆分路径,例如:
print "./abc123a1/type/1ab2_a_data_type.file.type".split("/")
会给:
['.', 'abc123a1', 'type', '1ab2_a_data_type.file.type']
然后,您可以创建一个set
,其中包含第二个条目,直到' _'在第四个条目中,例如
('abc123a1', '1ab2')
然后可以使用它来仅打印每个条目的第一个条目:
pairs = set()
with open(sys.argv[1], 'r') as in_file, open('extracted.csv', 'wb') as out_file:
writer = csv.writer(out_file)
for row in in_file:
folders = row.split("/")
col_a = folders[1]
col_b = folders[3].split("_")[0]
if (col_a, col_b) not in pairs:
pairs.add((col_a, col_b))
writer.writerow([col_a, col_b])
所以输入如下:
./abc123a1/type/1ab2_a_data_type.file.type
./abc123a1/type/1ab2_b_data_type.file.type
./abc123a2/type/1ab2_a_data_type.file.type
./abc123a3/type/1ab2_a_data_type.file.type
你会得到一个类似的CSV文件:
abc123a1,1ab2
abc123a2,1ab2
abc123a3,1ab2