簡體   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