python-3.x - 如何在 pandas.read_csv() 之前预处理数据
问题描述
我有一个稍微损坏的 CSV 文件,我想在使用 pandas.read_csv() 读取它之前对其进行预处理,即对其进行一些搜索/替换。
我尝试打开文件并在生成器中进行预处理,然后将其交给 read_csv():
def in_stream():
with open("some.csv") as csvfile:
for line in csvfile:
l = re.sub(r'","',r',',line)
yield l
df = pd.read_csv(in_stream())
可悲的是,这只会引发
ValueError: Invalid file path or buffer object type: <class 'generator'>
虽然,在查看 Panda 的源代码时,我希望它能够在迭代器上工作,从而在生成器上工作。
我只找到了这篇 [article] (Using a custom object in pandas.read_csv()),概述了如何将生成器包装到类似文件的对象中,但它似乎只适用于字节模式的文件。
所以最后我正在寻找一种模式来构建一个打开文件的管道,逐行读取它,允许预处理,然后将其输入例如pandas.read_csv()。
解决方案
在进一步调查 Pandas 的源代码后,很明显,它不仅需要一个可迭代的,而且还希望它是一个文件,通过一个读取方法(inference.py 中的 is_file_like())来表达。
所以,我用旧的方式建造了一个发电机
class InFile(object):
def __init__(self, infile):
self.infile = open(infile)
def __next__(self):
return self.next()
def __iter__(self):
return self
def read(self, *args, **kwargs):
return self.__next__()
def next(self):
try:
line: str = self.infile.readline()
line = re.sub(r'","',r',',line) # do some fixing
return line
except:
self.infile.close()
raise StopIteration
这适用于 pandas.read_csv():
df = pd.read_csv(InFile("some.csv"))
对我来说,这看起来超级复杂,我想知道是否有更好(→ 更优雅)的解决方案。
推荐阅读
- javascript - 澄清 appendChild
- java - 在java中获取处理json对象的错误消息
- python - 如何绘制元素计数和添加注释
- xml - “XML 任务”xslt 错误以非规范化 XML 文件
- flutter - Flutter:如何创建这个可拖动的底部小部件?
- mysql - 如何避免mysql查询系统锁定
- photon - 光子。在 Android 上重启 WI-FI 后 OnRoomListUpdate 不起作用
- javascript - 无法在 Angular js 中创建选项卡
- python - 如何以数据类表示法将类实例添加到类变量中?
- opencart-3 - Opencart - 同一产品的多个附属公司重定向选项代替“添加到购物车”