Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python解析文本文件并输出到CSV_Python_Regex_Python 2.7_Parsing_Csv - Fatal编程技术网

用python解析文本文件并输出到CSV

用python解析文本文件并输出到CSV,python,regex,python-2.7,parsing,csv,Python,Regex,Python 2.7,Parsing,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.

序言-我对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,但我也没有运气让它起作用。

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

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])
第一个
print
s包含
f
的所有行,因此第二个行没有任何内容可以重复,除非您首先
f.seek(0)
并倒带文件

另一种方法是:

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

如果没有一行以上的示例输入数据,很难判断您的正则表达式是否正常。

IMHO,您离让它工作不远了。问题是,您只需读取一次整个文件以打印行,然后(在文件末尾读取一次)尝试将它们放入列表中。。。然后得到一张空名单

您应该只读取文件一次:

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文件中

您确定需要所有正则表达式吗?您似乎正在分析路径和文件名列表。可以使用
split
命令拆分路径,例如:

print "./abc123a1/type/1ab2_a_data_type.file.type".split("/")
将提供:

['.', 'abc123a1', 'type', '1ab2_a_data_type.file.type']
然后,您可以创建一个
集合
,该集合由第二个条目和第四个条目中的“u”组成,例如

('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

当你打印
listOfData
时,它有你想要的数据吗?“所以我想抓住“1ab2_a”并忽略所有其他数据。”我不确定是否能很好地理解这句话。是否要提取
1ab2
1ab2\u a
?是否可以编辑问题以添加更多示例输入行?还要添加该输入的预期输出。