Tôi có một csv rất đơn giản, với dữ liệu sau, được nén bên trong tệp tar.gz. Tôi cần đọc nó trong dataframe bằng pandas.read_csv.
A B
0 1 4
1 2 5
2 3 6
import pandas as pd
pd.read_csv("sample.tar.gz",compression='gzip')
Tuy nhiên, tôi đang gặp lỗi:
CParserError: Error tokenizing data. C error: Expected 1 fields in line 440, saw 2
Sau đây là tập hợp các lệnh read_csv và các lỗi khác nhau mà tôi gặp phải với chúng:
pd.read_csv("sample.tar.gz",compression='gzip', engine='python')
Error: line contains NULL byte
pd.read_csv("sample.tar.gz",compression='gzip', header=0)
CParserError: Error tokenizing data. C error: Expected 1 fields in line 440, saw 2
pd.read_csv("sample.tar.gz",compression='gzip', header=0, sep=" ")
CParserError: Error tokenizing data. C error: Expected 2 fields in line 94, saw 14
pd.read_csv("sample.tar.gz",compression='gzip', header=0, sep=" ", engine='python')
Error: line contains NULL byte
Có chuyện gì ở đây vậy? Làm thế nào tôi có thể sửa lỗi này?
df = pd.read_csv('sample.tar.gz', compression='gzip', header=0, sep=' ', quotechar='"', error_bad_lines=False)
Ghi chú: error_bad_lines=False
sẽ bỏ qua các hàng vi phạm.
Bạn có thể sử dụng mô đun tarfile
để đọc một tệp cụ thể từ kho lưu trữ tar.gz (như đã thảo luận trong vấn đề được giải quyết này ). Nếu chỉ có một tệp trong kho lưu trữ, thì bạn có thể làm điều này:
import tarfile
import pandas as pd
with tarfile.open("sample.tar.gz", "r:*") as tar:
csv_path = tar.getnames()[0]
df = pd.read_csv(tar.extractfile(csv_path), header=0, sep=" ")
Chế độ đọc r:*
Xử lý phần mở rộng gz (hoặc các loại nén khác) một cách thích hợp. Nếu có nhiều tệp trong tệp tar được nén, thì bạn có thể thực hiện một số thứ như dòng csv_path = list(n for n in tar.getnames() if n.endswith('.csv'))[-1]
để lấy tệp csv cuối cùng trong thư mục lưu trữ.