Чому csvwriter.writerow () ставить кому після кожного символу?


97

Цей код відкриває 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 , передайте їй список списків, а не список рядків.
Ноумен

Відповіді:


148

Він очікує послідовності (наприклад, списку або кортежу) рядків. Ви даєте йому єдиний рядок. Рядок теж є послідовністю рядків, але це послідовність з 1 символьних рядків, що зовсім не те, що ви хочете.

Якщо вам потрібен лише один рядок на рядок, ви можете зробити щось подібне:

csvwriter.writerow([JD])

Це обгортає JD (рядок) зі списком.


Дякую! Це виправило це. Я спробую також інші відповіді. Я також створив порожній список JDList = [] і додав JD до цього, що також працює, але це простіше.
Зейнел

1
Тепер він також пише лапки рядка. Чи є спосіб обійти це?
CGFoX

@CGFoX Чи можете ви розмістити приклад коду, який це демонструє?
Лоуренс Гонсалвес,

writer.writerow([datetime.now().strftime("%Y-%m-%d %H:%M:%S")])записує дату як"2016-11-05 20:30:19"
CGFoX

@CGFoX Я не можу відтворити таку поведінку. Я отримую 2016-11-05 13:21:11без лапок. Яку версію Python ви використовуєте?
Лоуренс Гонсалвес,

5

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

Щоб виправити це, ви можете розділити значення на основі пробілів (я припускаю, що це те, що ви хочете)

csvwriter.writerow(JD.split())

1

Це трапляється, тому що коли метод group () екземпляра MatchObject повертає лише одне значення, він повертає його як рядок. Коли є кілька значень, вони повертаються у вигляді набору рядків.

Якщо ви пишете рядок, мабуть, csv.writer перебирає об'єкт, який ви йому передаєте. Якщо ви передаєте один рядок (який є ітерабельним), він перебирає свої символи, отримуючи результат, який ви спостерігаєте. Якщо ви передаєте кортеж рядків, він отримує фактичний рядок, а не жоден символ на кожній ітерації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.