Подтвердить что ты не робот

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

Этот код открывает 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", "Юридическая школа Колумбии"....), то я получаю

JD, Columbia Law School...)

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

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

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

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

4b9b3361

Ответ 1

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

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

csvwriter.writerow([JD])

Это переносит JD (строку) со списком.

Ответ 2

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

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

csvwriter.writerow(JD.split())

Ответ 3

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

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