Python csv模块在写入文件

时间:2017-06-25 10:02:07

标签: python csv

我遇到了Python 3.6的csv模块的问题。我需要将一些数据写入4列中的csv文件,并使用制表符作为分隔符。我明确地设置了它:

outputFile = open('test_tasks.csv', 'w', newline='')
outputWriter = csv.writer(outputFile, delimiter='\t')

for item in range(len(data)):
    outputWriter.writerow(['created: ' + data[item]['created'], 'status: ' + data[item]['status'], 'coordinates: ' + data[item]['tasks'][0]['input_values']['coordinates'], 'id: ' + data[item]['tasks'][0]['id'], 'user_id ' + data[0]['user_id']])

但是当我在Windows Notepad中打开生成的文件时,我发现有时只有一个空格而不是列之间的标签。最常见的是当前面的值比通常更短(包含更少的符号)。例如:

created: 2017-01-19T04:39:41.012 status: EXPIRED coordinates: 56.91969408920,60.03087172680  id: ffbc4048-cc5a-4578-b0d9-0705a588b55d    user_id 165684b434e6390fb8da262978601397
created: 2017-02-24T16:08:10.280    status: EXPIRED coordinates: 55.915326,37.869891    id: 90437e00-d15c-4679-b7be-6d3660efdbce    user_id 165684b434e6390fb8da262978601397
created: 2016-12-09T14:16:43.240    status: ACCEPTED    coordinates: 55.683752,37.491063    id: 831c4cef-7eb1-4a3e-9a27-037d8c12ce28    user_id 165684b434e6390fb8da262978601397
created: 2017-01-08T10:06:30.454    status: ACCEPTED    coordinates: 59.958408,30.331696    id: e1b1f2c1-bcd7-4394-90cb-df54bfe082aa    user_id 165684b434e6390fb8da262978601397
created: 2017-02-12T13:20:27.100    status: ACCEPTED    coordinates: 55.762166,37.619099    id: bc648343-d71a-41af-8ae6-d6fa60946824    user_id 165684b434e6390fb8da262978601397
created: 2017-03-23T22:00:25.362    status: ACCEPTED    coordinates: 56.284944,43.929684    id: a9c94269-d128-428b-a62d-911be9693b5a    user_id 165684b434e6390fb8da262978601397

我错过了什么或是一些csv模块错误?有没有办法用Python正确编写带分隔符的csv文件?

1 个答案:

答案 0 :(得分:1)

这里没有问题。 Python输出制表符很好。制表符不是用间隔符修复的,它们只将光标移动到下一个制表位。如果下一个制表位只有一个空格,那么你就可以得到你的输出。

制表位通常设置为固定宽度间隔,每4或8个空格是常见的。然后,制表符可以将光标从1到7个空格之间的任何位置移动,具体取决于当前光标位置。

尝试以下代码并在记事本文本编辑器中打开生成的tabs.txt

with open('tabs.txt', 'w') as f:
    digits = '0123456789'
    for i in range(1, 11):
        print(digits[:i] + '\tNext column', file=f)

你会看到类似的东西:

0   Next column
01  Next column
012 Next column
0123    Next column
01234   Next column
012345  Next column
0123456 Next column
01234567    Next column
012345678   Next column
0123456789  Next column

如果您的制表符大小为8而不是4,那么前4行可以使下一列文本移动另外4个空格; Stack Overflow在每个第4列配置了制表位,因此在此处进行渲染。

如果您需要固定宽度输出,不使用制表符,甚至是csv模块。使用字符串格式,使用指定的列宽:

with open('test_tasks.csv', 'w') as outputFile:
    for entry in data:
        outputWriter.write(
            f"created: {entry['created']:<23} "
            f"status: {entry[status]:<8} "
            f"coordinates: {entry['tasks'][0]['input_values']['coordinates']:<30} "
            f"id: {entry['tasks'][0]['id']:<36} "
            f"user_id {entry['user_id']}\n")