好的,您的代码有很多问题:
- 你的缩进全错了。这是python的基本概念之一。如果您不明白我的意思,请上网搜索并阅读一些内容
- 打开“test2.txt”的部分位于垃圾邮件阅读器的循环内,这意味着它会为“test.csv”中的每一行重新打开和截断。
- 您正在尝试使用以下行将文件写入自身: writer.writerows(f) (记得吗?f 是您正在写入的文件...)
- 您正在使用 csv.writer 将行写入txt文件。
- 您希望每个项目之间有一个间距,但您没有在代码中的任何地方这样做
因此,总结所有这些问题,这是一个固定的示例,它与您的代码实际上并没有那么远:
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, ' ', ... ]。你把它结合在一起,就是这样。