Python Pandas Error ในการโทเค็นข้อมูล


343

ฉันพยายามใช้นุ่นเพื่อจัดการไฟล์. csv แต่ฉันได้รับข้อผิดพลาดนี้:

pandas.parser.CParserError: เกิดข้อผิดพลาดในการเก็บข้อมูล ข้อผิดพลาด C: ต้องการเขตข้อมูล 2 แห่งในบรรทัดที่ 3 เห็น 12

ฉันพยายามอ่านเอกสารของนุ่น แต่ไม่พบอะไรเลย

รหัสของฉันง่าย:

path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)

ฉันจะแก้ไขปัญหานี้ได้อย่างไร ฉันควรใช้csvโมดูลหรือภาษาอื่นหรือไม่?

ไฟล์มาจากMorningstar


10
หากข้อผิดพลาดนี้เกิดขึ้นเมื่ออ่านไฟล์ที่เขียนโดยpandas.to_csv()อาจเป็นเพราะมี '\ r' ในชื่อคอลัมน์ซึ่งในกรณี to_csv () จริง ๆ แล้วจะเขียนชื่อคอลัมน์ที่ตามมาลงในคอลัมน์แรกของเฟรมข้อมูลทำให้เกิด ความแตกต่างระหว่างจำนวนคอลัมน์ในแถว X แรก ความแตกต่างนี้เป็นสาเหตุหนึ่งของข้อผิดพลาด C
0

9
บางครั้งก็ให้พารามิเตอร์ "sep" อย่างชัดเจน ดูเหมือนว่าจะเป็นปัญหาในการแยกวิเคราะห์
gilgamash

2
ข้อผิดพลาดนี้อาจเกิดขึ้นเมื่อคุณใช้เครื่องหมายจุลภาคเป็นตัวคั่นและคุณมีเครื่องหมายจุลภาคมากกว่าที่คาดไว้ (เขตข้อมูลเพิ่มเติมในแถวข้อผิดพลาดแล้วกำหนดไว้ในส่วนหัว) ดังนั้นคุณต้องลบฟิลด์เพิ่มเติมหรือลบเครื่องหมายจุลภาคพิเศษหากมีโดยไม่ตั้งใจ คุณสามารถแก้ไขได้ด้วยตนเองจากนั้นคุณไม่จำเป็นต้องข้ามบรรทัดข้อผิดพลาด
tsveti_iko

2
ความคิดเห็นจาก gilgamash ช่วยฉัน เปิดไฟล์ csv ใน text editor (เช่น windows editor หรือ notepad ++) เพื่อดูว่าอักขระตัวใดที่ใช้สำหรับการแยก pd.read_csv("<path>", sep=";")หากเป็นเช่นอัฒภาคลอง อย่าใช้ Excel ในการตรวจสอบเนื่องจากบางครั้งข้อมูลจะถูกนำไปไว้ในคอลัมน์ตามค่าเริ่มต้นดังนั้นจึงลบตัวคั่น
Julian

เกี่ยวกับความคิดเห็นโดย @gilgamash - สิ่งนี้ส่งฉันไปในทิศทางที่ถูกต้อง แต่ในกรณีของฉันมันได้รับการแก้ไขโดยไม่ให้พารามิเตอร์ "sep" อย่างชัดเจน
TheLoneDeranger

คำตอบ:


515

คุณสามารถลอง;

data = pd.read_csv('file1.csv', error_bad_lines=False)

โปรดทราบว่าการทำเช่นนี้จะทำให้เกิดการข้ามบรรทัด


152
โปรดทราบว่าการใช้ error_bad_lines = False จะทำให้บรรทัดที่มีการละเมิดถูกข้าม
biobirdman

10
สะดุดกับคำตอบนี้มีวิธีเติมคอลัมน์ที่ขาดหายไปในบรรทัดที่แสดงผลลัพธ์ออกมาเป็นexpected 8 fields, saw 9อย่างไร?
Petra Barus

26
ทางออกที่ดีกว่าคือการตรวจสอบไฟล์ที่ละเมิดและแก้ไขบรรทัดที่ไม่ดีเพื่อให้สามารถอ่านread_csvได้ @ PetraBarus ทำไมไม่เพิ่มคอลัมน์ลงในไฟล์ CSV ที่หายไป (ด้วยค่า Null ตามต้องการ)
dbliss

4
ใช่ฉันแค่ทำอย่างนั้น ง่ายขึ้นมากโดยการเพิ่มคอลัมน์ การเปิด CSV ในสเปรดชีตทำได้เช่นนี้
Petra Barus

5
การส่งผ่านnames=["col1", "col2", ...]จำนวนคอลัมน์สูงสุดที่คาดหวังก็ใช้ได้เช่นกันและนี่คือวิธีที่ฉันแก้ไขปัญหานี้เมื่อฉันเจอมัน ดู: stackoverflow.com/questions/18039057/…
Steven Rouk

100

อาจเป็นปัญหากับ

  • ตัวคั่นในข้อมูลของคุณ
  • แถวแรกตามที่ @TomAugspurger ตั้งข้อสังเกต

จะแก้ปัญหาได้ลองระบุsepและ / หรือข้อโต้แย้งเมื่อโทรheader read_csvตัวอย่างเช่น

df = pandas.read_csv(fileName, sep='delimiter', header=None)

ในรหัสด้านบนให้sepนิยามตัวคั่นของคุณและheader=Noneบอกนุ่นว่าแหล่งข้อมูลของคุณไม่มีแถวสำหรับหัวเรื่องส่วนหัว / คอลัมน์ ดังนั้นdocs : "หากไฟล์ไม่มีแถวส่วนหัวคุณควรส่ง header = None อย่างชัดเจน" ในอินสแตนซ์นี้แพนด้าจะสร้างดัชนีจำนวนเต็มโดยอัตโนมัติสำหรับแต่ละฟิลด์ {0,1,2, ... }

ตามเอกสารสิ่งที่ตัวคั่นไม่ควรเป็นปัญหา เอกสารบอกว่า "ถ้า sep คือ None [ไม่ได้ระบุ] จะพยายามกำหนดสิ่งนี้โดยอัตโนมัติ" ฉันยังไม่ได้โชคดีกับสิ่งนี้รวมถึงกรณีที่มีตัวคั่นชัดเจน


ใช่บางครั้งตัวคั่นอาจเป็นสาเหตุของปัญหานี้ ฉันประสบปัญหาเดียวกันกับที่ตัวคั่นเป็นเครื่องหมายอัฒภาค (;)
Anurag Sharma

43

โปรแกรมแยกวิเคราะห์กำลังสับสนโดยส่วนหัวของไฟล์ มันอ่านแถวแรกและ infers จำนวนคอลัมน์จากแถวนั้น แต่สองแถวแรกไม่ได้เป็นตัวแทนของข้อมูลจริงในไฟล์

ลองด้วย data = pd.read_csv(path, skiprows=2)


30

ไฟล์ CSV ของคุณอาจมีจำนวนคอลัมน์แปรผันและread_csvสรุปจำนวนคอลัมน์จากสองสามแถวแรก สองวิธีในการแก้ไขในกรณีนี้:

1) เปลี่ยนไฟล์ CSV เป็นบรรทัดแรกที่มีจำนวนคอลัมน์สูงสุด (และระบุheader=[0])

2) หรือใช้โดยnames = list(range(0,N))ที่ N คือจำนวนคอลัมน์สูงสุด


25

นี้แน่นอนปัญหาของตัวคั่นเป็นส่วนใหญ่ของ CSV CSV จะได้สร้างโดยใช้sep='/t'จึงพยายามที่จะread_csvใช้ตัวอักษรแท็บใช้คั่น(\t) /tดังนั้นลองเปิดโดยใช้บรรทัดรหัสต่อไปนี้

data=pd.read_csv("File_path", sep='\t')

5
@MichaelQueue: นี่ไม่ถูกต้อง CSV แม้ว่าคั่นด้วยเครื่องหมายจุลภาคโดยทั่วไปอาจคั่นด้วยอักขระอื่นเช่นกัน ดูรายละเอียด CSV อาจเป็นเครื่องหมายจุลภาคแท็บ ('\ t') เครื่องหมายอัฒภาคและอาจเว้นวรรคเพิ่มเติม :)
DJGrandpaJ

ในกรณีของฉันมันเป็นปัญหาตัวคั่น read_csv เห็นได้ชัดว่าเป็นค่าเริ่มต้นไปยังเครื่องหมายจุลภาคและฉันมีช่องข้อความซึ่งรวมถึงเครื่องหมายจุลภาค (และข้อมูลถูกเก็บไว้กับตัวคั่นที่แตกต่างกันอยู่แล้ว)
user108569

หากใช้เครื่องหมายจุลภาคในค่า แต่แท็บคือตัวคั่นและไม่ใช้ sep (หรือตามที่แนะนำไว้เหนือตัวคั่นสิ่งที่จะถือว่าเกิดขึ้นในค่า) ข้อผิดพลาดนี้จะเกิดขึ้น ตรวจสอบให้แน่ใจว่าตัวคั่นไม่เกิดขึ้นในค่าใด ๆ บางแถวจะมีจำนวนคอลัมน์ไม่ถูกต้อง
demongolem

ฉันใช้ excel 2016 ขณะสร้าง CSV และใช้ sep = ';' ทำงานให้ฉัน
Abdullah กล่าวเมื่อ

18

ฉันมีปัญหานี้เช่นกัน แต่อาจด้วยเหตุผลอื่น ฉันมีจุลภาคต่อท้ายใน CSV ของฉันที่เพิ่มคอลัมน์เพิ่มเติมที่แพนด้าพยายามอ่าน ใช้งานต่อไปนี้ แต่จะไม่สนใจบรรทัดที่ไม่ดี:

data = pd.read_csv('file1.csv', error_bad_lines=False)

หากคุณต้องการให้แฮ็กที่น่าเกลียดสำหรับการจัดการข้อผิดพลาดคือการทำสิ่งต่อไปนี้:

line     = []
expected = []
saw      = []     
cont     = True 

while cont == True:     
    try:
        data = pd.read_csv('file1.csv',skiprows=line)
        cont = False
    except Exception as e:    
        errortype = e.message.split('.')[0].strip()                                
        if errortype == 'Error tokenizing data':                        
           cerror      = e.message.split(':')[1].strip().replace(',','')
           nums        = [n for n in cerror.split(' ') if str.isdigit(n)]
           expected.append(int(nums[0]))
           saw.append(int(nums[2]))
           line.append(int(nums[1])-1)
         else:
           cerror      = 'Unknown'
           print 'Unknown Error - 222'

if line != []:
    # Handle the errors however you want

ฉันดำเนินการเขียนสคริปต์เพื่อแทรกบรรทัดลงใน DataFrame อีกครั้งเนื่องจากบรรทัดที่ไม่ดีจะถูกกำหนดโดยตัวแปร 'line' ในโค้ดด้านบน ทั้งหมดนี้สามารถหลีกเลี่ยงได้โดยเพียงแค่ใช้เครื่องอ่าน csv หวังว่าผู้พัฒนาแพนด้าจะสามารถจัดการกับสถานการณ์นี้ได้ง่ายขึ้นในอนาคต


14

ฉันมีปัญหานี้ที่ฉันพยายามอ่านใน CSV โดยไม่ผ่านชื่อคอลัมน์

df = pd.read_csv(filename, header=None)

ฉันระบุชื่อคอลัมน์ในรายการล่วงหน้าแล้วส่งต่อไปnamesและจะแก้ไขทันที หากคุณไม่ได้ตั้งชื่อคอลัมน์คุณสามารถสร้างชื่อตัวแทนได้มากถึงจำนวนคอลัมน์สูงสุดที่อาจอยู่ในข้อมูลของคุณ

col_names = ["col1", "col2", "col3", ...]
df = pd.read_csv(filename, names=col_names)

1
คำตอบนี้ดีกว่าเพราะแถวจะไม่ถูกลบเมื่อเทียบกับหากใช้ error_bad_line = False นอกจากนี้คุณสามารถทราบได้อย่างง่ายดายว่าบรรทัดใดที่เป็นปัญหาเมื่อสร้างดาต้าเฟรมจากโซลูชันนี้
zipline86

ฉันเห็นด้วยกับ @ zipline86 คำตอบนี้ปลอดภัยและชาญฉลาด
โมนิก้า Heddneck

11

ฉันมีปัญหานี้สองสามครั้งด้วยตัวเอง เกือบทุกครั้งเหตุผลคือไฟล์ที่ฉันพยายามเปิดนั้นไม่ใช่ CSV ที่ถูกบันทึกไว้อย่างถูกต้องที่จะเริ่มต้น และโดย "ถูกต้อง" ฉันหมายถึงแต่ละแถวมีตัวคั่นหรือคอลัมน์จำนวนเท่ากัน

โดยทั่วไปจะเกิดขึ้นเพราะฉันได้เปิด CSV ใน Excel แล้วบันทึกไม่ถูกต้อง แม้ว่านามสกุลของไฟล์จะเป็น. csv แต่รูปแบบ CSV ล้วนถูกเปลี่ยนแปลง

ไฟล์ใด ๆ ที่บันทึกด้วย pandas to_csv จะได้รับการจัดรูปแบบอย่างเหมาะสมและไม่ควรมีปัญหานั้น แต่ถ้าคุณเปิดด้วยโปรแกรมอื่นมันอาจเปลี่ยนโครงสร้าง

หวังว่าจะช่วย


8

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

แก้ไข: ฉันพบว่าข้อผิดพลาดนี้เกิดขึ้นเมื่อคุณมีข้อความในไฟล์ของคุณที่ไม่มีรูปแบบเดียวกับข้อมูลจริง นี่คือข้อมูลส่วนหัวหรือส่วนท้าย (มากกว่าหนึ่งบรรทัดดังนั้น skip_header ไม่ทำงาน) ซึ่งจะไม่คั่นด้วยเครื่องหมายจุลภาคจำนวนเท่ากันกับข้อมูลจริงของคุณ (เมื่อใช้ read_csv) การใช้ read_table ใช้แท็บเป็นตัวคั่นซึ่งสามารถหลีกเลี่ยงข้อผิดพลาดปัจจุบันของผู้ใช้ แต่แนะนำคนอื่น ๆ

ฉันมักจะได้รับสิ่งนี้โดยการอ่านข้อมูลพิเศษลงในไฟล์จากนั้นใช้เมธอด read_csv ()

โซลูชันที่แน่นอนอาจแตกต่างกันไปขึ้นอยู่กับไฟล์จริงของคุณ แต่วิธีนี้ใช้ได้ผลกับฉันในหลายกรณี


6

ต่อไปนี้ใช้งานได้สำหรับฉัน (ฉันโพสต์คำตอบนี้เพราะฉันมีปัญหานี้โดยเฉพาะในสมุดบันทึกความร่วมมือ Google):

df = pd.read_csv("/path/foo.csv", delimiter=';', skiprows=0, low_memory=False)

1
ฉันทดลองปัญหาเมื่อไม่ได้ตั้งค่า|เป็นตัวคั่นสำหรับ. csv ของฉัน ฉันควรลองวิธีนี้ก่อนแทนที่จะข้ามเส้นหรือเส้นที่ไม่ดี
ivanleoncz

ฉันยังมีปัญหาเดียวกันฉันถือว่า "\ t" จะถูกตรวจพบว่าเป็นตัวคั่นตามค่าเริ่มต้น มันทำงานได้เมื่อฉันตั้งค่าตัวคั่นเป็น "\ t" อย่างชัดเจน
ราหุล Jha

5

ฉันมีปัญหาที่คล้ายกันในขณะที่พยายามอ่านตารางคั่นด้วยแท็บที่มีช่องว่าง, จุลภาคและคำพูด:

1115794 4218    "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", ""
1144102 3180    "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", "g__Bacillus", ""
368444  2328    "k__Bacteria", "p__Bacteroidetes", "c__Bacteroidia", "o__Bacteroidales", "f__Bacteroidaceae", "g__Bacteroides", ""



import pandas as pd
# Same error for read_table
counts = pd.read_csv(path_counts, sep='\t', index_col=2, header=None, engine = 'c')

pandas.io.common.CParserError: Error tokenizing data. C error: out of memory

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

counts = pd.read_table(path_counts, sep='\t', index_col=2, header=None, engine='python')

Segmentation fault (core dumped)

ตอนนี้เป็นข้อผิดพลาดที่แตกต่างกัน
หากเราดำเนินการต่อไปและพยายามลบช่องว่างออกจากตารางข้อผิดพลาดจาก python-engine จะเปลี่ยนอีกครั้ง:

1115794 4218    "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae",""
1144102 3180    "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae","g__Bacillus",""
368444  2328    "k__Bacteria","p__Bacteroidetes","c__Bacteroidia","o__Bacteroidales","f__Bacteroidaceae","g__Bacteroides",""


_csv.Error: '   ' expected after '"'

และเห็นได้ชัดว่าแพนด้ากำลังมีปัญหาในการแยกแถวของเรา ในการแยกวิเคราะห์ตารางด้วยโปรแกรม python ฉันจำเป็นต้องลบช่องว่างและเครื่องหมายคำพูดทั้งหมดออกจากตารางล่วงหน้า ในขณะเดียวกัน C-engine ยังคงหยุดทำงานแม้จะมีเครื่องหมายจุลภาคเป็นแถว

เพื่อหลีกเลี่ยงการสร้างไฟล์ใหม่ด้วยการแทนที่ฉันทำสิ่งนี้เนื่องจากตารางของฉันมีขนาดเล็ก:

from io import StringIO
with open(path_counts) as f:
    input = StringIO(f.read().replace('", ""', '').replace('"', '').replace(', ', ',').replace('\0',''))
    counts = pd.read_table(input, sep='\t', index_col=2, header=None, engine='python')

tl; dr
เปลี่ยนเครื่องมือการแยกวิเคราะห์พยายามหลีกเลี่ยงคำพูด / เครื่องหมายจุลภาค / ช่องว่างในข้อมูลของคุณ


5

ชุดข้อมูลที่ฉันใช้มีเครื่องหมายคำพูด (") ใช้การจัดรูปแบบภายนอกฉันสามารถแก้ไขข้อผิดพลาดโดยรวมพารามิเตอร์นี้สำหรับread_csv():

quoting=3 # 3 correlates to csv.QUOTE_NONE for pandas

2
เจอสิ่งเดียวกันที่แน่นอน เท่าที่ฉันกังวลนี่คือคำตอบที่ถูกต้อง คนที่ยอมรับเพียงแค่ซ่อนข้อผิดพลาด
lhk

คำตอบที่ถูกต้องสำหรับฉันเช่นกัน +1
Taha Jirjees


3

แม้ว่าจะไม่ใช่กรณีสำหรับคำถามนี้ข้อผิดพลาดนี้อาจปรากฏขึ้นพร้อมกับข้อมูลที่บีบอัด การตั้งค่าเพื่อkwarg compressionแก้ไขปัญหาของฉันอย่างชัดเจน

result = pandas.read_csv(data_source, compression='gzip')

3

อีกทางเลือกหนึ่งที่ฉันพบว่ามีประโยชน์ในการจัดการกับข้อผิดพลาดในการวิเคราะห์คำที่คล้ายกันใช้โมดูล CSV เพื่อจัดเส้นทางข้อมูลไปยัง pandas df อีกครั้ง ตัวอย่างเช่น:

import csv
import pandas as pd
path = 'C:/FileLocation/'
file = 'filename.csv'
f = open(path+file,'rt')
reader = csv.reader(f)

#once contents are available, I then put them in a list
csv_list = []
for l in reader:
    csv_list.append(l)
f.close()
#now pandas has no problem getting into a df
df = pd.DataFrame(csv_list)

ฉันพบว่าโมดูล CSV มีความทนทานต่อไฟล์ที่คั่นด้วยเครื่องหมายจุลภาคที่จัดรูปแบบไม่ดีนักและประสบความสำเร็จในเส้นทางนี้เพื่อแก้ไขปัญหาเช่นนี้


3

ลำดับของคำสั่งใช้งานได้ (ฉันสูญเสียบรรทัดแรกของ data-no header = None present- แต่อย่างน้อยก็โหลด):

df = pd.read_csv(filename, usecols=range(0, 42)) df.columns = ['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14']

การติดตามไม่ทำงาน:

df = pd.read_csv(filename, names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'], usecols=range(0, 42))

CParserError: เกิดข้อผิดพลาดในการเก็บข้อมูล ข้อผิดพลาด C: คาดว่าจะมี 53 ฟิลด์ในบรรทัด 1605634 เห็น 54 การติดตามไม่ทำงาน:

df = pd.read_csv(filename, header=None)

CParserError: เกิดข้อผิดพลาดในการเก็บข้อมูล ข้อผิดพลาด C: คาดว่าจะมี 53 ฟิลด์ในบรรทัด 1605634 เห็น 54

ดังนั้นในปัญหาของคุณคุณต้องผ่าน usecols=range(0, 2)


3

สำหรับผู้ที่มีปัญหาคล้ายกับ Python 3 บน linux OS

pandas.errors.ParserError: Error tokenizing data. C error: Calling
read(nbytes) on source failed. Try engine='python'.

ลอง:

df.read_csv('file.csv', encoding='utf8', engine='python')

2

บางครั้งปัญหาไม่ได้เป็นวิธีการใช้หลาม แต่กับข้อมูลดิบ
ฉันได้รับข้อความแสดงข้อผิดพลาดนี้

Error tokenizing data. C error: Expected 18 fields in line 72, saw 19.

ปรากฎว่าในคำอธิบายคอลัมน์บางครั้งมีเครื่องหมายจุลภาค ซึ่งหมายความว่าจำเป็นต้องล้างไฟล์ CSV หรือใช้ตัวคั่นอื่น


2

ใช้ pandas.read_csv('CSVFILENAME',header=None,sep=', ')

เมื่อพยายามอ่านข้อมูล csv จากลิงค์

http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data

ฉันคัดลอกข้อมูลจากเว็บไซต์ไปยัง csvfile ของฉัน มันมีช่องว่างพิเศษจึงใช้ sep = ',' และมันก็ใช้ได้ :)


1

ฉันมีชุดข้อมูลที่มีหมายเลขแถวที่อยู่ตรงหน้าฉันใช้ index_col:

pd.read_csv('train.csv', index_col=0)

1

นี่คือสิ่งที่ฉันทำ

sep='::' แก้ไขปัญหาของฉัน:

data=pd.read_csv('C:\\Users\\HP\\Downloads\\NPL ASSINGMENT 2 imdb_labelled\\imdb_labelled.txt',engine='python',header=None,sep='::')

1

ฉันมีกรณีที่คล้ายกันเช่นนี้และการตั้งค่า

train = pd.read_csv('input.csv' , encoding='latin1',engine='python') 

ทำงาน


1

ฉันมีปัญหาเดียวกันเมื่อ read_csv: ParserError: เกิดข้อผิดพลาดในการเก็บข้อมูล ฉันเพิ่งบันทึกไฟล์ csv เก่าไปยังไฟล์ csv ใหม่ ปัญหาได้รับการแก้ไขแล้ว!


1

ปัญหาสำหรับผมคือการที่คอลัมน์ใหม่ได้รับการผนวกเข้ากับ CSV ของฉันระหว่างวัน วิธีการแก้ปัญหาคำตอบที่ได้รับการยอมรับจะไม่ทำงานตามที่ทุกerror_bad_lines=Falseแถวในอนาคตจะถูกยกเลิกหากฉันใช้

ทางออกในกรณีนี้คือการใช้ usecolspd.read_csv()พารามิเตอร์ใน วิธีนี้ฉันสามารถระบุเฉพาะคอลัมน์ที่ฉันต้องอ่านใน CSV และรหัส Python ของฉันจะยังคงมีความยืดหยุ่นต่อการเปลี่ยนแปลง CSV ในอนาคตตราบใดที่มีคอลัมน์ส่วนหัวอยู่ (และชื่อคอลัมน์จะไม่เปลี่ยนแปลง)

usecols : list-like or callable, optional 

Return a subset of the columns. If list-like, all elements must either
be positional (i.e. integer indices into the document columns) or
strings that correspond to column names provided either by the user in
names or inferred from the document header row(s). For example, a
valid list-like usecols parameter would be [0, 1, 2] or ['foo', 'bar',
'baz']. Element order is ignored, so usecols=[0, 1] is the same as [1,
0]. To instantiate a DataFrame from data with element order preserved
use pd.read_csv(data, usecols=['foo', 'bar'])[['foo', 'bar']] for
columns in ['foo', 'bar'] order or pd.read_csv(data, usecols=['foo',
'bar'])[['bar', 'foo']] for ['bar', 'foo'] order.

ตัวอย่าง

my_columns = ['foo', 'bar', 'bob']
df = pd.read_csv(file_path, usecols=my_columns)

ประโยชน์อีกอย่างของที่นี่คือฉันสามารถโหลดข้อมูลลงในหน่วยความจำน้อยลงได้ถ้าฉันใช้เพียง 3-4 คอลัมน์ของ CSV ที่มี 18-20 คอลัมน์


1

ความละเอียดอย่างง่าย : เปิดไฟล์ csv ใน excel & บันทึกด้วยไฟล์ชื่อที่แตกต่างกันของรูปแบบ csv ลองนำเข้า Spyder อีกครั้งปัญหาของคุณจะได้รับการแก้ไข!


1

ฉันพบข้อผิดพลาดนี้ด้วยเครื่องหมายอัญประกาศเดี่ยว ฉันใช้ซอฟต์แวร์การทำแผนที่ซึ่งจะใส่เครื่องหมายคำพูดรอบรายการข้อความเมื่อส่งออกไฟล์ที่คั่นด้วยเครื่องหมายจุลภาค ข้อความที่ใช้เครื่องหมายคำพูด (เช่น '= ฟุตและ "= นิ้ว) อาจมีปัญหาเมื่อเกิดการชนตัวคั่นลองพิจารณาตัวอย่างนี้ซึ่งบันทึกว่าการพิมพ์บันทึกที่ดีขนาด 5 นิ้วไม่ดี:

UWI_key,Latitude,Longitude,Remark US42051316890000,30.4386484,-96.4330734,"poor 5""

ใช้5"เป็นชวเลขสำหรับ5 inchใช้ขว้างประแจในงาน Excel จะดึงเครื่องหมายอัญประกาศออกไปอย่างง่าย ๆ แต่ Pandas พังโดยไม่มีerror_bad_lines=Falseข้อโต้แย้งดังกล่าวข้างต้น


1

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

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

วิธีที่ง่ายที่สุดคือใช้ฟังก์ชั่นแพนด้าpd.read_clipboard()หลังจากเลือกและคัดลอกตารางไปยังคลิปบอร์ดด้วยตนเองในกรณีที่คุณสามารถเปิด csv ใน excel หรืออะไรบางอย่าง

ไม่เกี่ยวข้อง :

นอกจากนี้ไม่เกี่ยวข้องกับปัญหาของคุณ แต่เนื่องจากไม่มีใครพูดถึงเรื่องนี้ : ฉันมีปัญหาเดียวกันนี้เมื่อโหลดชุดข้อมูลบางอย่างเช่นseeds_dataset.txtจาก UCI \tในกรณีของข้อผิดพลาดเกิดขึ้นเพราะแยกบางมีช่องว่างมากขึ้นกว่าแท็บจริง ดูบรรทัดที่ 3 ในตัวอย่างต่อไปนี้

14.38   14.21   0.8951  5.386   3.312   2.462   4.956   1
14.69   14.49   0.8799  5.563   3.259   3.586   5.219   1
14.11   14.1    0.8911  5.42    3.302   2.7     5       1

ดังนั้นการใช้ในรูปแบบที่คั่นแทน\t+\t

data = pd.read_csv(path, sep='\t+`, header=None)

1

ในกรณีของฉันเป็นเพราะรูปแบบของบรรทัดแรกและสองบรรทัดสุดท้ายของไฟล์ csv นั้นแตกต่างจากเนื้อหาตรงกลางของไฟล์

ดังนั้นสิ่งที่ฉันทำคือเปิดไฟล์ csv เป็นสตริงแยกเนื้อหาของสตริงจากนั้นใช้read_csvเพื่อรับ dataframe

import io
import pandas as pd

file = open(f'{file_path}/{file_name}', 'r')
content = file.read()

# change new line character from '\r\n' to '\n'
lines = content.replace('\r', '').split('\n')

# Remove the first and last 2 lines of the file
# StringIO can be considered as a file stored in memory
df = pd.read_csv(StringIO("\n".join(lines[2:-2])), header=None)

1

ในกรณีของฉันตัวคั่นไม่ใช่ค่าเริ่มต้น "," แต่เป็นแท็บ

pd.read_csv(file_name.csv, sep='\\t',lineterminator='\\r', engine='python', header='infer')

หมายเหตุ: "\ t" ไม่ทำงานตามที่แนะนำโดยบางแหล่ง ต้องการ "\\ t"


0

ฉันมีข้อผิดพลาดที่คล้ายกันและปัญหาคือว่าฉันมีบางคำพูดที่หลบหนีในไฟล์ csv ของฉันและจำเป็นต้องตั้งค่าพารามิเตอร์ escapechar อย่างเหมาะสม

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