使用Python的GSpread合并CSV到谷歌表格时浮点数显示异常
问题:CSV导入Google Sheets后浮点数格式异常(0.12显示为12)
我使用Python的GSpread工具将多个CSV文件合并到一个Google表格(每个CSV对应一个工作表),合并流程正常,但大量类似0.12的浮点数在新表格中被显示为12。临时修改谷歌账号首选语言为加拿大英语可解决问题,但希望找到更简便的方案。
问题根源
这个问题是因为Google Sheets的区域设置使用了逗号(,)作为小数点分隔符(比如欧洲部分地区的默认设置),而CSV文件中用点(.)作为小数点。此时Sheets会把.识别为千位分隔符,0.12就被解析成了12。
解决方案
1. 创建表格时直接指定区域设置(推荐)
用Sheets API创建表格时,显式指定使用点作为小数点的区域(如en_CA、en_US),从根源避免格式解析错误。修改create_spreadsheet函数如下:
def create_spreadsheet(sheet_title, output_folder_id): sheets_api = build('sheets', 'v4', credentials=creds) drive_api = build('drive', 'v3', credentials=creds) # 创建带指定区域的表格 spreadsheet_body = { 'properties': { 'title': sheet_title, 'locale': 'en_CA' # 加拿大英语区域,小数点为. } } sheet_response = sheets_api.spreadsheets().create(body=spreadsheet_body).execute() sheet_id = sheet_response['spreadsheetId'] # 若需移动到指定文件夹 if output_folder_id: # 移除默认父文件夹并添加目标文件夹 drive_api.files().update( fileId=sheet_id, addParents=output_folder_id[0], removeParents=sheet_response['properties']['parentFolderId'], fields='id, parents' ).execute() return sheet_id
2. 导入后强制设置单元格小数格式
如果无法修改表格的区域设置,可以在导入数据后,为数值列强制设置标准小数格式,确保Sheets用点作为小数点。修改add_csv_files_to_spreadsheet中的对应部分:
def add_csv_files_to_spreadsheet(files, spreadsheet): worksheet_names = list() for file in files: filename = file.get("name") sheetName = filename.split(".")[0] sheet_id = file.get("id") downloaded_content = gdrive.CreateFile({'id': sheet_id}) downloaded_content.GetContentFile(filename) # 让pandas自动识别数据类型,不要强制转字符串 content_df = pd.read_csv(filename) no_rows = len(content_df) no_cols = len(content_df.columns) worksheet = spreadsheet.add_worksheet(title=sheetName, rows=no_rows, cols=no_cols) gd.set_with_dataframe(worksheet, content_df) # 为所有数值列设置标准小数格式 col_letters = [chr(ord('A') + i) for i in range(no_cols)] for idx, col in enumerate(col_letters): if pd.api.types.is_numeric_dtype(content_df.iloc[:, idx]): # 应用小数格式,确保用.作为分隔符 worksheet.format(f"{col}:{col}", { "numberFormat": { "type": "NUMBER", "pattern": "#,##0.00" } }) worksheet_names.append(sheetName) spreadsheet.del_worksheet(spreadsheet.sheet1)
3. 读取CSV时显式指定小数点分隔符
如果CSV文件的格式固定,读取时可以明确指定小数点为.,避免pandas解析出错:
content_df = pd.read_csv(filename, decimal='.')
说明
- 方案1是最彻底的解决方式,一次性解决所有后续工作表的格式问题。
- 方案2适合已有表格无法修改区域设置的场景,针对性修复数值列格式。
- 方案3可配合前两个方案使用,确保CSV读取阶段的数值准确性。
内容的提问来源于stack exchange,提问作者AnnemarieWittig
相关产品推荐
相关产品推荐

