在django中通过用户输入来编写csv文件:每个字符都出现在新行中

时间:2018-10-19 14:47:12

标签: python csv

在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

2 个答案:

答案 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']

在您的情况下,您基本上是在传递一个字符串,该字符串是可迭代的(可重复的)字符串(长度为一的字符串)。因此,它将每个字符放在自己的行中。