使用pd.read_csv读取谷歌云端CSV文件出现异常结果求助
问题描述
作为Python纯新手,我尝试编写读取Google Drive上公共CSV数据的脚本,CSV内容很简单:
1,2,3
文件由MS Excel创建,经Notepad++编辑。我试了两种代码:
变体1:
import pandas as pd url='https://drive.google.com/file/d/1WgaA_dIHYm3ogCUE4WDu1ocwgQSZ1Wc7/view?usp=sharing' file_id = url.split('/')[-2] dwn_url='https://drive.google.com/uc?id=' + file_id df = pd.read_csv(dwn_url) print(df.head()))
变体2:
import pandas as pd import requests from io import StringIO url='https://drive.google.com/file/d/1WgaA_dIHYm3ogCUE4WDu1ocwgQSZ1Wc7/view?usp=sharing' file_id = url.split('/')[-2] dwn_url='https://drive.google.com/uc?export=download&id=' + file_id url2 = requests.get(dwn_url).text csv_raw = StringIO(url2) df = pd.read_csv(csv_raw) print(df.head())
两种代码都报错:
pandas.errors.ParserError: Error tokenizing data. C error: Expected 90 fields in line 3, saw 217
用read_csv(dwn_url, on_bad_lines='skip')后,输出的是HTML和JS内容,显然Pandas读到的不是CSV文件,而是Google的验证页面。即使导入完全空的CSV也会出现同样情况,请问有什么解决办法?
解决方案
1. 先确认文件共享权限
这是最容易忽略的点:必须把你的Google Drive文件设置为**「任何人拥有链接均可查看」**:
- 打开文件的共享设置
- 把权限从「仅限特定用户」改成「知道链接的任何人」,权限级别设为「查看者」
2. 用gdown库简化下载(推荐)
gdown是专门用来下载Google Drive文件的Python库,比手动构造链接靠谱得多,先安装:
pip install gdown
然后用以下代码读取:
import pandas as pd import gdown file_id = '1WgaA_dIHYm3ogCUE4WDu1ocwgQSZ1Wc7' url = f'https://drive.google.com/uc?id={file_id}' output = 'temp.csv' gdown.download(url, output, quiet=False) # 读取CSV df = pd.read_csv(output) print(df.head())
3. 手动处理验证页面(不用第三方库)
如果不想额外安装库,需要处理Google可能弹出的验证页面(比如大文件或频繁访问时),可以通过会话保持和验证令牌解决:
import pandas as pd import requests from io import StringIO file_id = '1WgaA_dIHYm3ogCUE4WDu1ocwgQSZ1Wc7' url = f'https://drive.google.com/uc?export=download&id={file_id}' session = requests.Session() response = session.get(url, stream=True) # 处理下载验证令牌 for key, value in response.cookies.items(): if key.startswith('download_warning'): params = {'id': file_id, 'confirm': value} response = session.get(url, params=params, stream=True) break # 读取并解析CSV csv_content = response.content.decode('utf-8') df = pd.read_csv(StringIO(csv_content)) print(df.head())
4. 先检查下载内容是否正确
在调用pd.read_csv之前,先打印response.text(或csv_content)看看是不是真的CSV内容。如果还是HTML,说明权限或链接有问题,回头检查共享设置。
内容的提问来源于stack exchange,提问作者441109
相关产品推荐
相关产品推荐

