ทำไม csvwriter.writerow () จึงใส่เครื่องหมายจุลภาคหลังอักขระแต่ละตัว


100

รหัสนี้จะเปิด 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
John Paulett

1
หากคุณพบปัญหานี้กับ writer.writerow sให้ส่งรายการของรายการไม่ใช่รายการสตริง
Noumenon

คำตอบ:


153

คาดว่าจะมีลำดับ (เช่นรายการหรือทูเพิล) ของสตริง คุณให้มันเป็นสตริงเดียว สตริงก็เป็นลำดับของสตริงเช่นกัน แต่เป็นลำดับของสตริงอักขระ 1 ตัวซึ่งไม่ใช่สิ่งที่คุณต้องการ

หากคุณต้องการเพียงหนึ่งสตริงต่อแถวคุณสามารถทำสิ่งนี้ได้:

csvwriter.writerow([JD])

สิ่งนี้รวม JD (สตริง) ด้วยรายการ


ขอบคุณ! สิ่งนี้แก้ไขได้ ฉันจะลองคำตอบอื่น ๆ ด้วย ฉันยังสร้างรายการว่าง JDList = [] และต่อท้าย JD ซึ่งก็ใช้ได้เช่นกัน แต่มันง่ายกว่า
Zeynel

2
ตอนนี้ยังเขียนเครื่องหมายคำพูดของสตริง มีวิธีการประมาณนั้นหรือไม่?
CGFoX

@CGFoX คุณสามารถโพสต์โค้ดตัวอย่างที่แสดงถึงสิ่งนี้ได้หรือไม่?
Laurence Gonsalves

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 เวอร์ชันใด
Laurence Gonsalves

7

คลาส csv.writer สามารถทำซ้ำได้เนื่องจากเป็นอาร์กิวเมนต์ของ writerow เนื่องจากสตริงใน Python สามารถทำซ้ำได้ตามอักขระจึงเป็นอาร์กิวเมนต์ที่ยอมรับได้สำหรับ writerow แต่คุณจะได้ผลลัพธ์ข้างต้น

เพื่อแก้ไขสิ่งนี้คุณสามารถแบ่งค่าตามช่องว่าง (ฉันสมมติว่านั่นคือสิ่งที่คุณต้องการ)

csvwriter.writerow(JD.split())

1

สิ่งนี้เกิดขึ้นเนื่องจากเมื่อเมธอด group () ของอินสแตนซ์ MatchObject ส่งกลับเพียงค่าเดียวมันจะส่งกลับเป็นสตริง เมื่อมีหลายค่าค่าเหล่านี้จะถูกส่งกลับเป็นทูเพิลของสตริง

หากคุณกำลังเขียนแถวฉันเดาว่า csv.writer จะวนซ้ำบนวัตถุที่คุณส่งผ่านไป หากคุณส่งสตริงเดี่ยว (ซึ่งสามารถทำซ้ำได้) มันจะวนซ้ำทับอักขระของมันทำให้ได้ผลลัพธ์ที่คุณสังเกตเห็น หากคุณส่งสตริงทูเพิลก็จะได้สตริงจริงไม่ใช่อักขระเดียวในการวนซ้ำทุกครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.