在django中,我有一些用户提交的表单包含一个文本区域。在该文本区域中,他们粘贴电子表格中的信息。他们粘贴时,此信息将以制表符分隔。我要做的是根据此信息(以逗号分隔)制作一个CSV文件。这是我的工作:
input = request.POST['data']
path = '/path/to/file.csv'
in_txt = csv.reader(input, delimiter = '\t')
out_csv = csv.writer(open(path, 'w'))
out_csv.writerows(in_txt)
但是,如果我使用此信息:
Header 1 Header 2 Header 3
Item 1 Item 1 Item 1
Item 2 Item 2 Item 2
然后将其转换为:
H
e
a
d
e
r
1
,
H
e
a
d
e
r
2
,
H
e
a
d
e
r
3
I
t
e
m
1
,
I
t
e
m
1
,
I
t
e
m
1
I
t
e
m
2
,
I
t
e
m
2
,
I
t
e
m
2
因此,每个字符都显示在新行上。为什么会这样?
使用django 2.1和python 3f
答案 0 :(得分:1)
csv.reader
期望行的可迭代行作为输入,但是您只是在传递字符串。由于字符串本身是可迭代的,因此读者会将每个字符解释为一行。
解决方案是将输入分为几行:
in_txt = csv.reader(input.split('\n'), delimiter = '\t')
答案 1 :(得分:0)
writerows
接受一个可迭代项。基本上,它需要一堆行。
my_rows = [['Head1'], ['Head2'], ['Head3']
['r1c1'], ['r1c2'], ['r1c3'],
['r2c1'], ['r2c2'], ['r2c3']
]
csv_writer.writerows(my_rows)
如果只有一行,则应使用writerow
,它需要进行迭代:
my_headers = ['Head1', 'Head2', 'Head3']
my_row_1 = ['r1c1', 'r1c2', 'r1c3']
在您的情况下,您基本上是在传递一个字符串,该字符串是可迭代的(可重复的)字符串(长度为一的字符串)。因此,它将每个字符放在自己的行中。