เปิดไฟล์ในโหมด universal-newline โดยใช้โมดูล CSV Django


86

ฉันพยายามเข้าถึงmodel.filefieldใน Django เพื่อแยกวิเคราะห์ไฟล์ CSVใน Python โดยใช้csvโมดูล มันทำงานบน Windows แต่บน Mac มันให้สิ่งนี้แก่ฉัน:

Exception Type: Error

Exception Value: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?

นี่คือรหัส:

myfile = customerbulk.objects.all()[0].fileup

mydata = csv.reader(myfile)
    for email,mobile,name,civilid in mydata:
        print email,mobile,name,civilid

นี่มันcustomerbulk.objects.all()[0].fileupอะไรกัน. เป็นชื่อไฟล์ในโมเดลหรือไม่?
SingleNegationElimination

fileup = models.FileField (verbose_name = "CsvFile", upload_to = 'ExcelFiles') ถ้าฉันสร้างแบบสอบถามขนาดเล็กเช่น customerbulk.objects.get (pk = 1)
mohd

1
เหตุผลที่แท้จริงของการใช้งานrU(มันเกี่ยวข้องกับฟังก์ชัน open () และไม่ได้เจาะจง csv): In addition to the standard fopen() values mode may be 'U' or 'rU'. Python is usually built with universal newlines support; supplying 'U' opens the file as a text file, but lines may be terminated by any of the following: the Unix end-of-line convention '\n', the Macintosh convention '\r', or the Windows convention '\r\n'. docs.python.org/2/library/functions.html#open
zengr

ใน Python> = 3 ให้ใช้newline=''แทนmode='U'.
tricasse

คำตอบ:


150

ในที่สุดฉันก็พบวิธีแก้ปัญหา:

mypath = customerbulk.objects.get(pk=1).fileup.path
o = open(mypath,'rU')
mydata = csv.reader(o)

2
ฉันเชื่อว่าคุณสามารถทำให้เรื่องนี้ง่ายขึ้น ดูเหมือนเป็นเรื่องแปลกที่จะพยายามเริ่มต้นหลังจากเพิ่งเปิดไฟล์ สิ่งต่อไปนี้ช่วยให้ฉันเอาชนะปัญหาเดียวกันจากการส่งออกสเปรดชีต Excel เป็น CSV โดยใช้ค่าเริ่มต้น: data = csv.reader (open (FILENAME, 'rU'), quotechar = '"', delimiter = ',')
timbo

4
ใช่ไม่จำเป็นต้องค้นหาจุดเริ่มต้นของไฟล์หลังจากเปิด บิต >>> o = open (mypath, 'rU') พร้อมกับแฟล็ก 'rU' เป็นเวทมนตร์ที่สำคัญที่ใช้งานได้ในกรณีของฉัน
rd108

13
PEP278อธิบายว่าrUย่อมาจากอะไร:In a Python with universal newline support open() the mode parameter can also be "U", meaning "open for input as a text file with universal newline interpretation". Mode "rU" is also allowed, for symmetry with "rb".
เสี่ยว

@Xiao +1 สำหรับการเชื่อมโยงไปยัง PEP ดั้งเดิมซึ่งอธิบายถึงเหตุผล
Naymesh Mistry

ในหลาม> = 3 ใช้newlineแทนค่าเริ่มต้นคือnewline=Noneซึ่งเป็นเหมือนยกเว้นว่ามันยังแปลเพื่อขึ้นบรรทัดใหม่newline='' \nฉันไม่แน่ใจว่าอันไหนเทียบเท่ากับmode='U'
timdiels
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.