Pythonic多个文本表在一个文本文件中进行CSV转换

时间:2014-04-16 20:13:23

标签: python csv text readfile

我还在学习python,并想知道编码以下问题的pythonic方式(也就是更少)。

由于20世纪90年代技术的奇迹,文本文件每天都会被转储到服务器上,其中包含csv表。这是正确的 - 一个带有两个 csv表的文本文件。

目标:解析csv表并将它们分成两个不同的csv文件。

文件如下所示:

start of file
blah blah
blah blah
blah blah

+--------
,tbl1, tbl1,
+--------
,data, data,
,data, data,
.....
,data,data
+--------
blah blah
blah blah
blah blah
+--------
,tbl2, tb2,
+--------
,data, data,
,data, data,
....
,data, data,
blah blah
blah blah

问题:表1的长度各不相同。

无论表的长度是多少,我都需要能够提取表1并将其作为CSV文件。

我有

def lp_to_csv(in_file_name, out_filename):
#open the input & output files.
inputfile = open(in_file_name, 'rb')
csv_file = out_filename
out_csvfile = open(csv_file, 'wb')

#read in the correct lines
my_text = inputfile.readlines()[117:-8]
del my_text[1]
for row in my_text:
    #cycle through to find the end
    if row[0] != ",":
        print "excludeded: " + row

#convert to csv using "," as delimiter
in_txt = csv.reader(my_text, delimiter = ',')
#hook csv writer to output file
out_csv = csv.writer(out_csvfile)
#write the data
out_csv.writerows(in_txt)

#close up
inputfile.close()
out_csvfile.close()

但该代码只生成1个csv文件,它包含第二个' blah blah'。

我想我知道如何制作两个csv文件(创建一个使用my_text对象创建csv文件的子程序,但是如何删除等等等等,以及如何触发何时将其切换为2个表?

任何人都可以指导我一个不错的pythonic方式吗?

ANSWERED: 与以下答案非常相似: 我创建了一个子例程,它创建了分隔符+-----所在的列表。因为它总是以三个为一组,第一,标题行,结束。

然后我把这个列表分成三组。

然后在每组三个上激活制作代码的表格。

到目前为止非常方便&无国籍,这很好。

3 个答案:

答案 0 :(得分:1)

请没有状态变量。

delimiter = '+--------'
try:
    while True:
        skip_junk(src, delimiter)
        table = read_table_name(delimiter)
        process_table(table, src, delimiter)
except ...

并让任何函数引发适当的异常(达到EOF;表名缺失,其他一些格式违规,无论如何)来打破循环,并且不要忘记处理它们。 通常,每个函数只在遇到分隔符时返回。

答案 1 :(得分:0)

我注意到表格以+--------开头和结尾。您可以使用它来解析文件。

你应该保留一个状态变量 - inside_csv。首先将其初始化为False。现在,逐个查看文件的行。如果您看到+--------,请翻转inside_csv(从False变为True或反之亦然)。

如果您看到另一行,请检查inside_csv。如果确实如此,请将该行写入CSV文件。如果不是,请忽略它。

完成第一个文件并开始第二个文件时,不要忘记切换CSV文件。

答案 2 :(得分:0)

未经测试,但这是一种方法

current_table = 0
headers_seen = 0
tables = [[], []]
for line in inputfile.readlines():
    if line == '+--------':
        headers_seen += 1
        if headers_seen == 2:
            current_table = 1
        elif headers_seen == 5:
            current_table = 2
        else:
            current_table = 0
        continue
    if not current_table:
        continue
    tables[current_table].append(line)

感觉它可能更干净,但我想处理任意数量的表;然后我意识到这是一个奇怪的标题问题,所以headers_seen == [2, 5]应该更聪明(比如= 2或大于4,header_seen%2 == 1)。