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

使用pd.read_csv读取字符串时触发EmptyDataError问题排查

问题分析与修复方案

错误原因及问题点

  • EmptyDataError根源:你创建了StringIO对象,但完全没把transactions的内容写入进去,直接就去读取,自然读不到任何数据。
  • 缺失必要函数:generate_random_string只被调用但没定义,运行时会触发NameError。
  • 分隔符设置错误:交易数据是用多个空格分隔的,不是制表符\t,用sep='\t'根本解析不出列。
  • 脏数据问题:第二行的Aktywna Warszawa后面多了个无关的S,会导致列数不匹配,解析失败。
  • 交易类型不准确:存款/转入类交易(比如## DEPOSIT、Dep Transf)的entry_type应该是incoming,不能统一设为outgoing。

修复后的完整代码

import random
import string
import csv
from ntropy_sdk import SDK, Transaction
from io import StringIO
import pandas as pd

transactions = """description   amount  iso_currency_code
Aktywna Warszawa   21.07   PLN
Crv*Ww Beauty Lukasz Mich   18.83   PLN
Bolt.Eu/R/2207180715    96.34   EUR
Purchase from AMZN  3.64    EUR
## DEPOSIT  95.77   EUR
CARD TRANSACTION #69420 74.05   EUR
>> ^0_o^ << 64.97   EUR
Crypto.com: Allegro.pl gift card purchase   74.7    EUR
Paypal help ukraine donate  68.76   EUR
OPENPAY*CERVEZASIEMPRE CIUDAD DE MEXIC  26.47   USD
PAYPAL INST XFER MICROSOFT ACH_DEBIT    4.9 USD
Paypal *xsolla mtgarena 70.35   USD
M10GRAPHIC   CA venture capital call    27.71   USD
Compra Cart Elo Estacao Imperial Ltd    52.88   USD
PIERRE CARD IN  79.28   USD
twitch blizzard overwatch Mr Streamer   45.76   USD
Dep Transf Bdn Maria Jose Resende   46.07   USD
AMZN Mktp US AWS    85.94   USD
LATE FEE FOR PAYMENT DUE transbank  86.89   USD
ntropy api pmnt 1.84    USD"""

# 补充缺失的随机字符串生成函数
def generate_random_string(length=8):
    return ''.join(random.choices(string.ascii_letters + string.digits, k=length))

def df_from_csv(transactions=None): 
    # 将交易内容写入StringIO
    csv_buffer = StringIO(transactions) 
    # 用任意多空格作为分隔符,指定python引擎支持\s+
    df = pd.read_csv(csv_buffer, sep='\s+', engine='python')
    txs = [] 

    account_name = generate_random_string()

    for i, row in df.iterrows():
        # 判断交易类型:含DEPOSIT/Dep Transf的设为incoming,否则outgoing
        entry_type = "incoming" if any(keyword in row['description'].upper() for keyword in ["DEPOSIT", "DEP TRANSF"]) else "outgoing"
        tx = {
            "date": "2022-01-01",
            "entry_type": entry_type,
            "amount": row['amount'],
            "iso_currency_code": row["iso_currency_code"],
            "description": row["description"],
            "transaction_id": f"id_{i}_{generate_random_string()}",
            "account_holder_type": "consumer",
            "account_holder_id": account_name,
        }
        txs.append(tx)

    return pd.DataFrame(txs)

# 测试调用
result_df = df_from_csv(transactions)
print(result_df)

关键修复说明

  1. 写入交易数据到StringIO:创建StringIO时直接传入transactions,确保读取到有效内容。
  2. 补充generate_random_string函数:实现了生成随机字母数字字符串的功能,用于生成账户名和交易ID。
  3. 修正分隔符:用sep='\s+'匹配任意多空格,同时指定engine='python',解决默认引擎不支持正则分隔符的问题。
  4. 清理脏数据:移除了第二行多余的S,保证列数匹配。
  5. 动态设置交易类型:通过判断描述中的关键词,自动区分收入和支出交易。

内容的提问来源于stack exchange,提问作者biGmazi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:45:38