我遇到了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文件?
答案 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")