在python中将多个特定文本文件转换为CSV

在python中将多个特定文本文件转换为CSV,python,Python,我有许多非常特殊格式的文本文件,需要读入csv。我似乎不知道如何以我想要的csv格式获取所有数据。我可以获取工作表的文件名和标题,但工作表中没有任何数据处于活动状态。文本文件如下所示: "market":"billing, MI" "mileStoneUpdates":"N" "woName":"Dsca_55354_55as0" "buildStage":"CPD" "designType":"Core" "woOverwrite":"Y" 我的代码: import os import cs

我有许多非常特殊格式的文本文件,需要读入csv。我似乎不知道如何以我想要的csv格式获取所有数据。我可以获取工作表的文件名和标题,但工作表中没有任何数据处于活动状态。文本文件如下所示:

"market":"billing, MI"
"mileStoneUpdates":"N"
"woName":"Dsca_55354_55as0"
"buildStage":"CPD"
"designType":"Core"
"woOverwrite":"Y"
我的代码:

import os
import csv

dirpath = 'C:\Usersnput\\'
output = 'C:\Users\gputew Microsoft Excel Worksheet.csv'
with open(output, 'w') as outfile:
    csvout = csv.writer(outfile)
    csvout.writerow(['market','mileStoneUpdates','woName','buildStage','designType','woOverwrite'])
files = os.listdir(dirpath)

for filename in files:
    with open(dirpath + '/' + filename) as afile:
        csvout.writerow([filename, afile.read()])
        afile.close()

outfile.close()
需要有标题的电子表格;market、mileStoneUpdates、woName、buildstage、designType、woOverwrite
每个文本文件中的单元格都充满了账单…ect

作为一般建议:熊猫图书馆对于这样的事情非常有用。如果我正确理解了您的问题,这基本上可以做到:

import os
import pandas as pd

dirpath = 'C:\Users\gputman\Desktop\Control_File_Tracker\Input\\'
output = 'C:\Users\gputman\Desktop\Control_File_Tracker\Output\New Microsoft Excel Worksheet.csv'
csvout = pd.DataFrame()

for filename in files:
    data = pd.read_csv(filename, sep=':', index_col=0, header=None).T
        csvout = csvout.append(data)

csvout.to_csv(output)

有关代码的说明,请参阅其中说明如何使用pandas读取转置文本文件。

您可以使用csv模块将输入文件解析为dict,并使用DictWriter将其写回:

import os
import csv

dirpath = 'C:\Users\gputman\Desktop\Control_File_Tracker\Input\\'
output = 'C:\Users\gputman\Desktop\Control_File_Tracker\Output\New Microsoft Excel Worksheet.csv'
with open(output, 'w', newline='') as outfile:
    csvout = csv.DictWriter(outfile, fieldnames =
                ['market','mileStoneUpdates','woName',
                 'buildStage','designType','woOverwrite'])
    csvout.writeheader()
    files = os.listdir(dirpath)

    for filename in files:
        with open(dirpath + '/' + filename) as afile:
            csvin = csv.reader(afile, delimiter=':')
            csvout.writerow({ row[0]: row[1] for row in csvin})
首先,关于“with…as”语法的注释:这是为您完成打开和关闭文件的所有工作而设计的,因此当您离开“with…as”块时,您的文件将自动关闭。因此,您的行“afile.close”是不必要的。此外,您以后将无法编辑输出文件,因为它已被关闭。所以请记住这一点

如果您正在寻找一种不需要任何附加库的解决方案(取决于您执行此类操作的频率),这应该是可行的,如果所有文件的格式完全相同:

import os
import csv

dirpath = 'C:\Users\gputman\Desktop\Control_File_Tracker\Input\\'
output = 'C:\Users\gputman\Desktop\Control_File_Tracker\Output\New Microsoft 
Excel Worksheet.csv'
outfile = open(output, 'w')
csvout = csv.writer(outfile)
csvout.writerow(['market','mileStoneUpdates','woName','buildStage','designType','woOverwrite'])
files = os.listdir(dirpath)

for filename in files:
    with open(dirpath + '/' + filename) as afile:
        row=[] # list of values we will be constructing
        for line in afile: # loops through the lines in the file one by one
            value = line.split(':')[1].strip('" \n') # I will be explaining this later
            row.append(value) # adds the retrieved value to our row
        csvout.writerow(row)

outfile.close()

现在让我们看看
值=…
行:
行中发生了什么。split(“:”)
生成一个由
“:”分隔的字符串列表。所以
““市场”:“billing,MI”\n'
变成了
[““market””,“'billing,MI”\n']
[1]
占据了列表的第二项(请记住,Python是零索引的),因为我们已经知道第一项(它是字段的名称)
.strip(““\n”)
从字符串的开头和结尾删除指定的字符(双引号、空格或换行符)。在某种程度上,它会“清理”字符串,以便只剩下实际值。

需要的更改很少:

  • 文件上的所有操作都需要在with子句中,并且不需要在其中关闭
  • 然后您需要从文件中收集数据
最简单的解决方案是:

import os
import csv
from collections import OrderedDict

HEADERS = ['market', 'mileStoneUpdates', 'woName', 'buildStage', 'designType', 'woOverwrite']

dirpath = '/tmp/input'
output = '/tmp/output'
with open(output, 'w') as outfile:
    csvout = csv.writer(outfile)
    csvout.writerow(HEADERS)
    files = os.listdir(dirpath)

    for filename in files:
        with open(dirpath + '/' + filename) as afile:
            data = OrderedDict.fromkeys(HEADERS, "")
            for line in afile:
                for header in HEADERS:
                    if line.startswith('"{}"'.format(header)):
                        value = line.split('"{}":"'.format(header)).pop()
                        value = value[:-2]
                        data[header] = value
            csvout.writerow(data.values())
            afile.close()

    outfile.close()
对于给定的输入文件:

"market":"billing, MI"
"mileStoneUpdates":"N"
"woName":"Dsca_55354_55as0"
"buildStage":"CPD"
"designType":"Core"
"woOverwrite":"Y"

"market":"billing, MI2"
"mileStoneUpdates":"N2"
"woName":"Dsca_55354_55as02"
"buildStage":"CPD2"
"designType":"Cor2e"
"woOverwrite":"Y2"
将产生:

market,mileStoneUpdates,woName,buildStage,designType,woOverwrite
"billing, MI",N,Dsca_55354_55as0,CPD,Core,Y
"billing, MI2",N2,Dsca_55354_55as02,CPD2,Cor2e,Y2

注意:如果文件中的数据更复杂,请使用regexp而不是简单的字符串拆分。

因此,在整个文本文件中,每个标题只有一个值,对吗?是的,每个文本文件都有标题和一个值,但显然,您有多个该格式的文本文件,并且希望将所有文本文件的内容合并为一个单独的文件e csv,但只使用一次标题,对吗?文本文件中行的顺序如何?总是相同还是可以更改?顺序不会更改,但您的解决方案有效。谢谢