Python中使用Pandas读取io.BytesIO对象报错的问题求助
问题:Pandas读取Google云端下载文件失败
我是Python新手,正按照谷歌云盘教程实现从云端读取文件的功能,原下载代码如下:
def download_file(real_file_id): try: service = authorize() file_id = real_file_id # pylint: disable=maybe-no-member request = service.files().get_media(fileId=file_id) file = io.BytesIO() downloader = MediaIoBaseDownload(file, request) done = False while done is False: status, done = downloader.next_chunk() print(F'Download {int(status.progress() * 100)}.') except HttpError as error: print(F'An error occurred: {error}') file = None return file.seek(0)
随后尝试用Pandas的read_csv读取文件的代码:
def read_file(item): with open(item, 'rb') as file: csvreader = pd.read_csv(file.read()) print(csvreader) if __name__ == '__main__': file = download_file("file_id") read_file(file)
确认下载功能正常,但读取时脚本卡住,手动终止后出现错误:
Traceback (most recent call last): File "C:\Users\tluce\PycharmProjects\pythonProject\main.py", line 23, in <module> read_file(download_file(files[0]['id'])) File "C:\Users\tluce\PycharmProjects\pythonProject\main.py", line 15, in read_file csvreader = pd.read_csv(file) File "C:\Users\tluce\PycharmProjects\pythonProject\venv\lib\site-packages\pandas\io\parsers\readers.py", line 912, in read_csv return _read(filepath_or_buffer, kwds) File "C:\Users\tluce\PycharmProjects\pythonProject\venv\lib\site-packages\pandas\io\parsers\readers.py", line 577, in _read parser = TextFileReader(filepath_or_buffer, **kwds) File "C:\Users\tluce\PycharmProjects\pythonProject\venv\lib\site-packages\pandas\io\parsers\readers.py", line 1407, in __init__ self._engine = self._make_engine(f, self.engine) File "C:\Users\tluce\PycharmProjects\pythonProject\venv\lib\site-packages\pandas\io\parsers\readers.py", line 1679, in _make_engine return mapping[engine](f, **self.options) File "C:\Users\tluce\PycharmProjects\pythonProject\venv\lib\site-packages\pandas\io\parsers\c_parser_wrapper.py", line 93, in __init__ self._reader = parsers.TextReader(src, **kwds) File "pandas\_libs\parsers.pyx", line 548, in pandas._libs.parsers.TextReader.__cinit__ File "pandas\_libs\parsers.pyx", line 637, in pandas._libs.parsers.TextReader._get_header File "pandas\_libs\parsers.pyx", line 848, in pandas._libs.parsers.TextReader._tokenize_rows File "pandas\_libs\parsers.pyx", line 859, in pandas._libs.parsers.TextReader._check_tokenize_status File "pandas\_libs\parsers.pyx", line 2025, in pandas._libs.parsers.raise_parser_error pandas.errors.ParserError: Error tokenizing data. C error: Calling read(nbytes) on source failed. Try engine='python'.
错误分析与修正
你的代码存在两个关键错误:
1. download_file返回值错误
file.seek(0)的返回值是整数0(表示文件指针移动到开头的位置),而不是你需要的BytesIO文件对象。这导致read_file接收到的是0,而非内存中的文件,后续open(0, 'rb')完全不符合逻辑,直接引发错误。
修正方法:先执行seek(0)重置指针,再返回file对象:
def download_file(real_file_id): try: service = authorize() file_id = real_file_id # pylint: disable=maybe-no-member request = service.files().get_media(fileId=file_id) file = io.BytesIO() downloader = MediaIoBaseDownload(file, request) done = False while done is False: status, done = downloader.next_chunk() print(f'Download {int(status.progress() * 100)}%.') except HttpError as error: print(f'An error occurred: {error}') file = None if file is not None: file.seek(0) # 重置文件指针到开头 return file
2. read_file处理方式错误
BytesIO是内存中的文件对象,不需要用open打开,直接传给pd.read_csv即可。pd.read_csv接受文件类对象(如BytesIO),不需要先调用file.read()把内容读成字节串。
修正后的read_file函数:
import pandas as pd def read_file(item): if item is None: print("文件下载失败") return csvreader = pd.read_csv(item) print(csvreader)
主函数调用
确保调用时处理download_file可能返回的None:
if __name__ == '__main__': file = download_file("你的文件ID") read_file(file)
内容的提问来源于stack exchange,提问作者Tomas Lucena
相关产品推荐
相关产品推荐

