You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 23:50:23