Почему csvwriter.writerow () ставит запятую после каждого символа?

98

Этот код открывает URL-адрес и добавляет /namesв конец, а также открывает страницу и печатает строку test1.csv:

import urllib2
import re
import csv

url = ("http://www.example.com")
bios = [u'/name1', u'/name2', u'/name3']
csvwriter = csv.writer(open("/test1.csv", "a"))

for l in bios:
    OpenThisLink = url + l
    response = urllib2.urlopen(OpenThisLink)
    html = response.read()
    item = re.search('(JD)(.*?)(\d+)', html)
    if item:
        JD = item.group()
        csvwriter.writerow(JD)
    else:
        NoJD = "NoJD"
        csvwriter.writerow(NoJD)

Но я получаю такой результат:

J,D,",", ,C,o,l,u,m,b,i,a, ,L,a,w, ,S,c,h,o,o,l,....

Если я поменяю строку на ("JD", "Columbia Law School" ....), я получу

JD, Columbia Law School...)

Я не нашел в документации, как указать разделитель.

Если я попытаюсь использовать, delimenterя получаю эту ошибку:

TypeError: 'delimeter' is an invalid keyword argument for this function

Спасибо за помощь.

Зейнель
источник
8
Это, delimiterа не delimeter: docs.python.org/library/csv.html
Джон Полетт,
Если вы столкнулись с этой проблемой с writer.writerow s , передайте ему список списков, а не список строк.
Ноумен

Ответы:

149

Ожидается последовательность (например, список или кортеж) строк. Вы даете ему одну строку. Строка тоже может быть последовательностью строк, но это последовательность строк из 1 символа, а это не то, что вам нужно.

Если вам нужна только одна строка в строке, вы можете сделать что-то вроде этого:

csvwriter.writerow([JD])

Это обертывает JD (строку) списком.

Лоуренс Гонсалвес
источник
Спасибо! Это исправило это. Я попробую и другие ответы. Я также создал пустой список JDList = [] и добавил к нему JD, это тоже работает, но это проще.
Zeynel
1
Теперь он также записывает кавычки строки. Есть ли способ обойти это?
CGFoX
@CGFoX Можете ли вы опубликовать пример кода, демонстрирующий это?
Лоуренс Гонсалвес
writer.writerow([datetime.now().strftime("%Y-%m-%d %H:%M:%S")])пишет datetime как"2016-11-05 20:30:19"
CGFoX
@CGFoX Я не могу воспроизвести такое поведение. Получаю 2016-11-05 13:21:11без кавычек. Какую версию Python вы используете?
Лоуренс Гонсалвес
5

Класс csv.writer принимает итеративный объект в качестве аргумента для writerow; поскольку строки в Python повторяются по символам, они являются приемлемым аргументом для writerow, но вы получите результат, указанный выше.

Чтобы исправить это, вы можете разделить значение на основе пробелов (я предполагаю, что вы хотите)

csvwriter.writerow(JD.split())
Габриэль Рид
источник
1

Это происходит потому, что когда метод group () экземпляра MatchObject возвращает только одно значение, он возвращает его как строку. Когда имеется несколько значений, они возвращаются как кортеж строк.

Если вы пишете строку, я думаю, csv.writer выполняет итерацию по объекту, который вы ему передаете. Если вы передаете одну строку (которая является итерируемой), она выполняет итерацию по своим символам, давая результат, который вы наблюдаете. Если вы передаете кортеж строк, он получает настоящую строку, а не один символ на каждой итерации.

хитрый
источник