0

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

任何帮助将不胜感激:提前谢谢您。

4

2 回答 2

0

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

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

第二次编辑

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

于 2013-09-05T12:51:14.307 回答
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)
于 2013-09-05T13:10:15.513 回答