Python Pandas Lỗi token hóa dữ liệu


341

Tôi đang cố gắng sử dụng gấu trúc để thao tác với tệp .csv nhưng tôi gặp lỗi này:

pandas.parser.CParserError: Lỗi mã thông báo dữ liệu. Lỗi C: Dự kiến ​​2 trường trong dòng 3, đã thấy 12

Tôi đã cố đọc tài liệu về gấu trúc, nhưng không tìm thấy gì.

Mã của tôi rất đơn giản:

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

Làm thế nào tôi có thể giải quyết điều này? Tôi nên sử dụng csvmô-đun hoặc ngôn ngữ khác?

Tệp từ Morningstar


10
Nếu lỗi này phát sinh khi đọc một tệp được viết bởi pandas.to_csv(), thì MIGHT là do có một '\ r' trong một tên cột, trong trường hợp đó, to_csv () sẽ thực sự ghi các tên cột tiếp theo vào cột đầu tiên của khung dữ liệu, gây ra sự khác biệt giữa số lượng cột trong các hàng X đầu tiên. Sự khác biệt này là một trong những nguyên nhân gây ra lỗi C.
dùng0

8
Đôi khi chỉ cần đưa ra tham số "sep" một cách rõ ràng. Có vẻ là một vấn đề phân tích cú pháp.
gilgamash

2
Lỗi này cũng có thể phát sinh khi bạn sử dụng dấu phẩy làm dấu phân cách và bạn có nhiều dấu phẩy hơn dự kiến ​​(nhiều trường trong hàng lỗi sau đó được xác định trong tiêu đề). Vì vậy, bạn cần xóa trường bổ sung hoặc xóa dấu phẩy thừa nếu nhầm lẫn. Bạn có thể sửa lỗi này bằng tay và sau đó bạn không cần bỏ qua các dòng lỗi.
tsveti_iko

2
Nhận xét từ gilgamash đã giúp tôi. Mở tệp csv trong trình soạn thảo văn bản (như trình soạn thảo windows hoặc notepad ++) để xem ký tự nào được sử dụng để phân tách. Nếu đó là một dấu chấm phẩy, ví dụ như thử pd.read_csv("<path>", sep=";"). Không sử dụng Excel để kiểm tra vì đôi khi nó đặt dữ liệu vào các cột theo mặc định và do đó xóa dấu phân cách.
Julian

Về nhận xét của @gilgamash - điều này đã gửi cho tôi đúng hướng, tuy nhiên trong trường hợp của tôi, nó đã được giải quyết bằng cách không đưa ra tham số "sep".
TheLoneDeranger

Câu trả lời:


514

bạn cũng có thể thử;

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

Xin lưu ý rằng điều này sẽ khiến các dòng vi phạm bị bỏ qua.


151
Xin lưu ý rằng việc sử dụng error_bad_lines = false sẽ khiến các dòng vi phạm bị bỏ qua.
sinh viên

10
Bị vấp ngã trong câu trả lời này, có cách nào để điền vào các cột bị thiếu trên các dòng tạo ra kết quả như thế expected 8 fields, saw 9nào không?
Petra Barus

26
Giải pháp tốt hơn là điều tra tệp vi phạm và sửa các dòng xấu để chúng có thể được đọc read_csv. @PetraBarus, tại sao không thêm các cột vào các tệp CSV thiếu chúng (với các giá trị null khi cần)?
dbliss

4
Vâng, tôi vừa làm điều đó. Nó dễ dàng hơn nhiều bằng cách thêm các cột. Mở CSV trong bảng tính thực hiện việc này.
Petra Barus

5
Truyền names=["col1", "col2", ...]cho số lượng cột dự kiến ​​tối đa cũng hoạt động và đây là cách tôi giải quyết vấn đề này khi tôi gặp nó. Xem: stackoverflow.com/questions/18049057/
Mạnh

99

Nó có thể là một vấn đề với

  • dấu phân cách trong dữ liệu của bạn
  • hàng đầu tiên, như @TomAugspurger lưu ý

Để giải quyết nó, hãy thử chỉ định sepvà / hoặc headerđối số khi gọi read_csv. Ví dụ,

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

Trong đoạn mã trên, sepxác định dấu phân cách của bạn và thông báo header=Nonecho gấu trúc rằng dữ liệu nguồn của bạn không có hàng cho tiêu đề / tiêu đề cột. Do đó, với các tài liệu : "Nếu tệp không chứa hàng tiêu đề, thì bạn nên vượt qua tiêu đề = Không". Trong trường hợp này, gấu trúc tự động tạo các chỉ số toàn số cho mỗi trường {0,1,2, ...}.

Theo các tài liệu, điều phân định không nên là một vấn đề. Các tài liệu nói rằng "nếu sep là Không [không được chỉ định], sẽ cố gắng tự động xác định điều này." Tuy nhiên tôi đã không gặp may mắn với điều này, bao gồm cả những trường hợp có dấu phân cách rõ ràng.


Có, đôi khi dấu phân cách có thể là nguyên nhân của vấn đề này. Tôi đã đối mặt với cùng một vấn đề trong đó dấu phân cách là dấu chấm phẩy (;)
Anurag Sharma

43

Trình phân tích cú pháp đang bị lẫn lộn bởi tiêu đề của tệp. Nó đọc hàng đầu tiên và ghi số lượng cột từ hàng đó. Nhưng hai hàng đầu tiên không đại diện cho dữ liệu thực tế trong tệp.

Hãy thử nó với data = pd.read_csv(path, skiprows=2)


30

Tệp CSV của bạn có thể có số lượng cột khác nhau và read_csvsuy ra số lượng cột từ một vài hàng đầu tiên. Hai cách để giải quyết nó trong trường hợp này:

1) Thay đổi tệp CSV để có dòng đầu tiên giả với số cột tối đa (và chỉ định header=[0])

2) Hoặc sử dụng names = list(range(0,N))trong đó N là số cột tối đa.


24

Đây chắc chắn là một vấn đề của dấu phân cách, vì hầu hết các csv CSV được tạo bằng cách sử dụng sep='/t'vì vậy hãy thử read_csvsử dụng ký tự tab (\t)bằng dấu phân cách /t. Vì vậy, hãy thử mở bằng cách sử dụng dòng mã sau đây.

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

5
@MichaelQueue: Điều này không chính xác. Một CSV, mặc dù thường được phân cách bằng dấu phẩy, cũng có thể được phân cách bằng các ký tự khác. Xem thông số kỹ thuật CSV . Nó có thể là dấu phẩy, tab ('\ t'), dấu chấm phẩy và có thể là khoảng trắng bổ sung. :)
DJGrandpaJ

trong trường hợp của tôi đó là một vấn đề phân cách. read_csv dường như mặc định là dấu phẩy và tôi có các trường văn bản bao gồm dấu phẩy (và dữ liệu được lưu trữ bằng một dấu phân cách khác)
user108569 17/07/18

Nếu dấu phẩy được sử dụng trong các giá trị nhưng tab là dấu phân cách và sep không được sử dụng (hoặc như được đề xuất ở trên dấu phân cách bất cứ điều gì được cho là xảy ra trong các giá trị) thì lỗi này sẽ xuất hiện. Đảm bảo rằng dấu phân cách không xảy ra trong bất kỳ giá trị nào khác, một số hàng sẽ xuất hiện có số cột không chính xác
demongolem

Tôi đang sử dụng excel 2016 trong khi tạo CSV và sử dụng sep = ';' làm việc cho tôi
Abdullah nói

18

Tôi đã có vấn đề này là tốt nhưng có lẽ vì một lý do khác. Tôi đã có một số dấu phẩy trong CSV của mình khi thêm một cột bổ sung mà gấu trúc đang cố đọc. Sử dụng các công việc sau đây nhưng nó chỉ đơn giản là bỏ qua các dòng xấu:

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

Nếu bạn muốn giữ cho các dòng một loại hack xấu xí để xử lý các lỗi là làm một cái gì đó như sau:

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

Tôi đã tiến hành viết một tập lệnh để gắn lại các dòng vào DataFrame vì các dòng xấu sẽ được đưa ra bởi biến 'line' trong đoạn mã trên. Tất cả điều này có thể tránh được bằng cách sử dụng trình đọc csv. Hy vọng rằng các nhà phát triển gấu trúc có thể làm cho nó dễ dàng hơn để đối phó với tình huống này trong tương lai.


14

Tôi gặp vấn đề này, ở đó tôi đã cố đọc trong CSV mà không chuyển tên cột.

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

Tôi đã chỉ định tên cột trong danh sách trước và sau đó chuyển chúng vào namesvà nó đã giải quyết nó ngay lập tức. Nếu bạn chưa đặt tên cột, bạn có thể tạo nhiều tên giữ chỗ như số cột tối đa có thể có trong dữ liệu của bạn.

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

1
Câu trả lời này tốt hơn vì hàng không bị xóa so với nếu sử dụng error_bad_line = false. Ngoài ra, bạn có thể dễ dàng tìm ra dòng nào là vấn đề một khi tạo một khung dữ liệu từ giải pháp này.
zipline86

Tôi đồng ý với @ zipline86. Câu trả lời này là an toàn và thông minh.
Monica Heddneck

11

Tôi đã có vấn đề này một vài lần bản thân mình. Hầu như mọi lúc, lý do là tập tin tôi đang cố mở không phải là một CSV được lưu đúng cách để bắt đầu. Và theo "đúng", ý tôi là mỗi hàng có cùng số dấu phân cách hoặc cột.

Thông thường, điều đó xảy ra vì tôi đã mở CSV trong Excel và sau đó lưu nó không đúng cách. Mặc dù phần mở rộng tệp vẫn là .csv, định dạng CSV thuần túy đã bị thay đổi.

Bất kỳ tệp nào được lưu với gấu trúc to_csv sẽ được định dạng chính xác và không nên có vấn đề đó. Nhưng nếu bạn mở nó bằng một chương trình khác, nó có thể thay đổi cấu trúc.

Mong rằng sẽ giúp.


8

Tôi đã gặp vấn đề tương tự. Sử dụng pd.read_table()trên cùng một tệp nguồn dường như làm việc. Tôi không thể theo dõi lý do cho việc này nhưng đó là một cách giải quyết hữu ích cho trường hợp của tôi. Có lẽ ai đó hiểu biết hơn có thể làm sáng tỏ hơn lý do tại sao nó hoạt động.

Chỉnh sửa: Tôi thấy rằng lỗi này tăng lên khi bạn có một số văn bản trong tệp của bạn không có cùng định dạng với dữ liệu thực tế. Đây thường là thông tin đầu trang hoặc chân trang (lớn hơn một dòng, do đó Skip_header không hoạt động) sẽ không được phân tách bằng cùng một số dấu phẩy như dữ liệu thực tế của bạn (khi sử dụng read_csv). Sử dụng read_table sử dụng một tab làm dấu phân cách có thể tránh được lỗi hiện tại của người dùng nhưng lại giới thiệu những người khác.

Tôi thường khắc phục điều này bằng cách đọc dữ liệu bổ sung vào một tệp sau đó sử dụng phương thức read_csv ().

Giải pháp chính xác có thể khác nhau tùy thuộc vào tệp thực tế của bạn, nhưng cách tiếp cận này đã có hiệu quả với tôi trong một số trường hợp


6

Những điều sau đây có hiệu quả với tôi (tôi đã đăng câu trả lời này, vì tôi đặc biệt gặp vấn đề này trong Sổ tay hướng dẫn Google):

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

1
Tôi đã thử nghiệm các vấn đề khi không đặt |làm dấu phân cách cho .csv của tôi. Tôi thà thử phương pháp này trước, thay vì bỏ qua các dòng, hoặc các dòng xấu.
ivanleoncz

Tôi cũng gặp vấn đề tương tự, tôi cho rằng "\ t" sẽ được phát hiện dưới dạng dấu phân cách theo mặc định. Nó hoạt động khi tôi đặt rõ ràng dấu phân cách thành "\ t".
Rahul Jha

5

Tôi đã gặp một vấn đề tương tự trong khi cố gắng đọc một bảng được phân định bằng tab có dấu cách, dấu phẩy và dấu ngoặc kép:

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

Điều này nói rằng nó có một cái gì đó để làm với công cụ phân tích cú pháp C (là công cụ mặc định). Có lẽ thay đổi thành một con trăn sẽ thay đổi bất cứ điều gì

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

Segmentation fault (core dumped)

Bây giờ đó là một lỗi khác nhau.
Nếu chúng ta tiếp tục và cố gắng xóa khoảng trắng khỏi bảng, lỗi từ python-engine sẽ thay đổi một lần nữa:

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 '"'

Và rõ ràng là gấu trúc đã gặp vấn đề khi phân tích các hàng của chúng tôi. Để phân tích một bảng với công cụ python, tôi cần phải xóa tất cả các khoảng trắng và dấu ngoặc kép khỏi bảng trước đó. Trong khi đó, động cơ C tiếp tục gặp sự cố ngay cả với dấu phẩy theo hàng.

Để tránh tạo một tệp mới với các thay thế, tôi đã làm điều này, vì các bảng của tôi nhỏ:

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
Thay đổi công cụ phân tích cú pháp, cố gắng tránh mọi dấu ngoặc kép / dấu phẩy / dấu cách trong dữ liệu của bạn.


5

Tập dữ liệu mà tôi đã sử dụng có rất nhiều dấu ngoặc kép (") được sử dụng ngoài định dạng. Tôi có thể sửa lỗi bằng cách đưa tham số này vào read_csv():

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

2
vấp ngã chính xác điều tương tự. Theo tôi nghĩ, đây là câu trả lời chính xác. Người được chấp nhận chỉ che giấu lỗi.
lhk

Câu trả lời đúng cho tôi quá. +1
Taha Jirjees

4

Sử dụng dấu phân cách trong tham số

pd.read_csv(filename, delimiter=",", encoding='utf-8')

Nó sẽ đọc.


3

Mặc dù không phải là trường hợp cho câu hỏi này, lỗi này cũng có thể xuất hiện với dữ liệu nén. Hoàn toàn thiết lập giá trị để kwarg compressiongiải quyết vấn đề của tôi.

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

3

Một giải pháp thay thế mà tôi thấy hữu ích trong việc xử lý các lỗi phân tích tương tự sử dụng mô-đun CSV để định tuyến lại dữ liệu vào một con gấu trúc df. Ví dụ:

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)

Tôi thấy mô-đun CSV mạnh hơn một chút với các tệp được phân tách bằng dấu phẩy được định dạng kém và vì vậy đã thành công với tuyến đường này để giải quyết các vấn đề như thế này.


3

chuỗi lệnh sau hoạt động (Tôi mất dòng đầu tiên của dữ liệu -no tiêu đề = Không có mặt nào- nhưng ít nhất nó tải):

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']

Sau đây KHÔNG hoạt động:

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: Lỗi mã thông báo dữ liệu. Lỗi C: Dự kiến ​​53 trường trong dòng 1605634, đã thấy 54 Sau đây KHÔNG hoạt động:

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

CParserError: Lỗi mã thông báo dữ liệu. Lỗi C: Dự kiến ​​53 trường trong dòng 1605634, đã thấy 54

Do đó, trong vấn đề của bạn, bạn phải vượt qua usecols=range(0, 2)


3

Đối với những người đang gặp vấn đề tương tự với Python 3 trên hệ điều hành linux.

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

Thử:

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

2

Đôi khi vấn đề không phải là làm thế nào để sử dụng python, mà là với dữ liệu thô.
Tôi nhận được thông báo lỗi này

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

Hóa ra trong mô tả cột đôi khi có dấu phẩy. Điều này có nghĩa là tệp CSV cần được dọn sạch hoặc sử dụng dấu phân cách khác.



1

Tôi đã có một bộ dữ liệu với các số hàng có sẵn, tôi đã sử dụng index_col:

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

1

Đây là những gì tôi đã làm.

sep='::' đã giải quyết vấn đề của tôi:

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

1

Tôi đã có một trường hợp tương tự như thế này và thiết lập

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

đã làm việc


1

Tôi gặp vấn đề tương tự khi read_csv: ParserError: Lỗi mã thông báo dữ liệu. Tôi vừa lưu tệp csv cũ vào tệp csv mới. Vấn đề đã được giải quyết!


1

Vấn đề đối với tôi là một cột mới đã được thêm vào CSV của tôi trong ngày . Giải pháp trả lời được chấp nhận sẽ không hoạt động vì mọi hàng trong tương lai sẽ bị loại bỏ nếu tôi sử dụng error_bad_lines=False.

Giải pháp trong trường hợp này là sử dụng tham số usecols trong pd.read_csv(). Bằng cách này, tôi chỉ có thể chỉ định các cột mà tôi cần đọc vào CSV và mã Python của tôi sẽ duy trì khả năng thay đổi đối với các thay đổi CSV trong tương lai miễn là tồn tại cột tiêu đề (và tên cột không thay đổi).

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.

Thí dụ

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

Một lợi ích khác của việc này là tôi có thể tải ít dữ liệu hơn vào bộ nhớ nếu tôi chỉ sử dụng 3-4 cột của CSV có 18-20 cột.


1

Độ phân giải đơn giản : Mở tệp csv trong excel và lưu tệp đó với tệp tên khác của định dạng csv. Hãy thử nhập lại gián điệp, vấn đề của bạn sẽ được giải quyết!


1

Tôi đã gặp lỗi này với một dấu ngoặc kép đi lạc. Tôi sử dụng phần mềm ánh xạ sẽ đặt dấu ngoặc kép quanh các mục văn bản khi xuất các tệp được phân tách bằng dấu phẩy. Văn bản sử dụng dấu ngoặc kép (ví dụ '= feet và "= inch) có thể gặp vấn đề khi sau đó gây ra xung đột dấu phân cách. Hãy xem xét ví dụ này lưu ý rằng bản in nhật ký giếng 5 inch là kém:

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

Sử dụng 5"như tốc ký cho 5 inchkết thúc ném cờ lê trong công trình. Excel sẽ chỉ đơn giản là loại bỏ dấu ngoặc kép phụ, nhưng Pandas bị phá vỡ mà không có error_bad_lines=Falseđối số được đề cập ở trên.


1

Theo như tôi có thể nói, và sau khi xem tệp của bạn, vấn đề là tệp csv bạn đang cố tải có nhiều bảng. Có các dòng trống hoặc các dòng có chứa tiêu đề bảng. Hãy thử xem câu trả lời Stackoverflow này . Nó cho thấy làm thế nào để đạt được điều đó theo chương trình.

Một cách tiếp cận năng động khác để làm điều đó là sử dụng mô-đun csv , đọc từng hàng một và thực hiện kiểm tra độ tỉnh táo / biểu thức chính quy, để suy luận xem hàng đó có (tiêu đề / tiêu đề / giá trị / trống). Bạn có một lợi thế nữa với cách tiếp cận này, đó là bạn có thể chia / nối / thu thập dữ liệu của mình trong các đối tượng python như mong muốn.

Cách đơn giản nhất là sử dụng chức năng gấu trúc pd.read_clipboard()sau khi chọn thủ công và sao chép bảng vào bảng tạm, trong trường hợp bạn có thể mở csv trong excel hoặc một cái gì đó.

Không liên quan :

Ngoài ra, không liên quan đến vấn đề của bạn, nhưng vì không ai đề cập đến vấn đề này : Tôi gặp vấn đề tương tự khi tải một số bộ dữ liệu như seeds_dataset.txttừ UCI. Trong trường hợp của tôi, lỗi đã xảy ra do một số dấu phân cách có nhiều khoảng trắng hơn một tab thực \t. Xem dòng 3 trong ví dụ sau

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

Do đó, sử dụng \t+trong mẫu phân cách thay vì \t.

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

1

Trong trường hợp của tôi, đó là do định dạng của hai dòng đầu tiên và cuối cùng của tệp csv khác với nội dung giữa của tệp.

Vì vậy, những gì tôi làm là mở tệp csv dưới dạng chuỗi, phân tích nội dung của chuỗi, sau đó sử dụng read_csvđể lấy một khung dữ liệu.

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

Trong trường hợp của tôi, dấu phân cách không phải là "," mặc định mà là Tab.

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

Lưu ý: "\ t" không hoạt động như được đề xuất bởi một số nguồn. "\ T" là bắt buộc.


0

Tôi đã có một lỗi tương tự và vấn đề là tôi đã thoát một số trích dẫn trong tệp csv của mình và cần đặt tham số escapechar một cách thích hợp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.