使用csv修复长度文本文件

时间:2013-09-05 12:06:18

标签: python csv text

我有一个csv文件,如下所示:

123456,456789,12345,123.45,123456 
123456,456789,12345,123.45,123456
123456,456789,12345,123.45,123456

我对Python编程非常陌生,但我正在学习并发现Python非常有用。我基本上希望输出看起来像这样:

123456    456789    12345    123.45    123456
123456    456789    12345    123.45    123456
123456    456789    12345    123.45    123456

基本上,所有字段都是正确的,具有固定的长度。 csv文件中没有标题。

这是我到目前为止尝试过的代码,就像我说的那样,我对Python很新:

import csv
 with open('test.csv') as csvfile:
spamreader = csv.reader(csvfile, delimiter=',')
for row in spamreader:
    print(', '.join(row))
    with open('test2.txt', 'wb') as f:
writer = csv.writer(f)
writer.writerows(f)

非常感谢任何帮助:提前谢谢。

2 个答案:

答案 0 :(得分:0)

好的,你的代码有很多问题:

  1. 你的缩进是错的。这是python的基本概念之一。如果您不明白我的意思,请去网上搜索一下它。
  2. 打开'test2.txt'的部分在spamreader的循环内是,这意味着它会在'test.csv'中的每一行重新打开并截断。
  3. 你试图用这一行把文件写到自己:writer.writerows(f)(记得?f是你要写的文件......)
  4. 您正在使用csv.writer将行写入 txt 文件。
  5. 您需要在每个项目之间留一个间距,但在代码中的任何位置都没有这样做
  6. 所以总结所有这些问题,这是一个固定的例子,它实际上离你的代码并不那么远:

    import csv
    
    res = []
    # start a loop to collect the data
    with open('test.csv') as csvfile:
        spamreader = csv.reader(csvfile, delimiter=',')
        for row in spamreader:
            line = '\t'.join(row) + '\r\n' # the \n is for linebreaks. \r is so notepad loves you too
            res.append(line)
    
    # now, outside the loop, we can do this:
    with open('test2.txt', 'wb') as f:
        f.writelines(res)
    

    修改

    如果你想控制间距你可以像这样使用ljust函数:

            line = ''.ljust(2).join(row) 
    

    这将确保每个项目之间有2个空格。 space是默认值,但是如果你想指定ljust将使用什么,你可以添加第二个参数:

            line = ''.ljust(5, '-').join(row) 
    

    然后每一行看起来像这样:

    123456-----456789-----12345-----123.45-----123456 
    

    感谢Philippe T.在评论中提到它

    第二次修改

    如果您希望每列的长度不同,则需要预定义它。最好的方法是创建一个与csv文件列长度相同的列表,每个项目都是该列的长度,最后一个是行的结尾(这很方便,因为''。join不能它本身),然后用你的行拉链。假设您想要第一列的选项卡,然后在每个其他列之间有两个空格。然后你的代码看起来像这样:

    spacing = ['\t', '  ', '  ', '  ', '\r\n']
    # ... the same code from before ...
            line = ''.join([j for i in zip(row, spacing) for j in i])
    # ... rest of the code ...
    

    列表理解循环有点复杂,但想想这样:

    for i in zip(row, spacing): # the zip here equals ==> [(item1, '\t'), (item2, '  ') ...]
        for j in i: # now i == (item1, '\t')
           j # so j is just the items of each tuple
    

    使用列表推导,输出:[item1,'\ t',item2,'',...]。你加入了这一点,就是这样。

答案 1 :(得分:0)

试试这个:

import csv
with open('data.csv') as fin, open('out.txt','w') as fout:
    data = csv.reader(fin,delimiter=',')
    resl = csv.writer(fout,delimiter='\t')
    resl.writerows(data)