【问题标题】:Fixed Length Text File using csv使用 csv 的固定长度文本文件
【发布时间】:2013-09-05 12:06:17
【问题描述】:

我有一个如下所示的 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)

任何帮助将不胜感激:在此先感谢您。

【问题讨论】:

标签: python csv text


【解决方案1】:

试试这个:

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)

【讨论】:

    【解决方案2】:

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

    1. 您的缩进完全错误。这是python的基本概念之一。如果您不明白我的意思,请在网上搜索并阅读一些内容
    2. 打开“test2.txt”的部分在垃圾邮件阅读器的循环内,这意味着它会重新打开并针对“test.csv”中的每一行进行截断。
    3. 您正在尝试使用以下行将文件写入自身:writer.writerows(f)(记得吗?f 是您正在写入的文件...)
    4. 您正在使用 csv.writer 将行写入 txt 文件。
    5. 您希望每个项目之间有一个间距,但您没有在代码中的任何地方这样做

    所以总结所有这些问题,这里有一个固定的例子,它与你的代码其实并没有那么远:

    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. 在 cmets 中提到它

    第二次编辑

    如果您希望每列具有不同的长度,则需要预定义它。最好的方法是创建一个与 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, ' ', ... ]。你把它结合起来就可以了。

    【讨论】:

    • 此外,我认为可以使用 basestring 的 ljust(或 rjust)方法来完成固定长度,而不是使用制表符
    • 如果你想将每一列定义为不同的长度,你会怎么写?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多