繁体   English   中英

在python中解析文本文件并输出到CSV

[英]Parsing a text file in python and outputting to a CSV

前言 - 我对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的调查,但是我也没有运气这么做。

恕我直言,你离它不远了。 问题是你读完整个文件只是为了打印行,然后(一旦在文件末尾)你试着把它们放到一个列表中...并获得一个空列表!

您应该只读取一次文件:

import sys
import csv

listOfData = []

with open(sys.argv[1]) as f:
    print "yes"
    for line in f:
        print line
        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文件

我不确定你的正则表达式(它很可能不会起作用),但你当前(非正则表达式,简单)代码不起作用的原因是因为 -

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])

我认为至少部分问题是以下两个for循环:

with open(sys.argv[1]) as f:
    print "yes"
    for line in f:
        print line
    for line in f:
        listOfData.append([line])

第一个printf的所有行,所以没有什么可以留给第二个迭代,除非你先f.seek(0)并倒回文件。

另一种方法就是这样:

with open(sys.argv[1]) as f:
    print "yes"
    for line in f:
        print line
        listOfData.append([line])

如果没有多行样本输入数据,很难判断你的正则表达式是否正常。

您确定需要所有正则表达式吗? 您似乎正在解析路径和文件名列表。 可以使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM