我有一个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)
非常感谢任何帮助:提前谢谢。
答案 0 :(得分:0)
好的,你的代码有很多问题:
所以总结所有这些问题,这是一个固定的例子,它实际上离你的代码并不那么远:
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)