使用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)
关键修复说明
- 写入交易数据到StringIO:创建
StringIO时直接传入transactions,确保读取到有效内容。 - 补充
generate_random_string函数:实现了生成随机字母数字字符串的功能,用于生成账户名和交易ID。 - 修正分隔符:用
sep='\s+'匹配任意多空格,同时指定engine='python',解决默认引擎不支持正则分隔符的问题。 - 清理脏数据:移除了第二行多余的
S,保证列数匹配。 - 动态设置交易类型:通过判断描述中的关键词,自动区分收入和支出交易。
内容的提问来源于stack exchange,提问作者biGmazi
相关产品推荐
相关产品推荐

