我还在学习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:
与以下答案非常相似:
我创建了一个子例程,它创建了分隔符+-----
所在的列表。因为它总是以三个为一组,第一,标题行,结束。
然后我把这个列表分成三组。
然后在每组三个上激活制作代码的表格。
到目前为止非常方便&无国籍,这很好。
答案 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)。