我在这里发现了一个类似的问题:Read CSV with PyArrow
在这个答案中,它引用了sys.stdin.buffer和sys.stdout.buffer,但是我不确定如何写.arrow文件,或者命名它。我似乎在pyarrow的文档中找不到我想要的确切信息。我的文件没有任何nans,但是它有一个时间戳索引。这个文件大约有100 gb,所以把它加载到内存中根本不是一个选项。我试着修改代码,但是正如我所设想的,代码在每个循环中都覆盖了前一个文件。
***这是我的第一个帖子。我想感谢所有的贡献者,他们在我问他们之前就回答了我99.9%的其他问题。
import sys
import pandas as pd
import pyarrow as pa
SPLIT_ROWS = 1 ### used one line chunks for a small test
def main():
writer = None
for split in pd.read_csv(sys.stdin.buffer, chunksize=SPLIT_ROWS):
table = pa.Table.from_pandas(split)
# Write out to file
with pa.OSFile('test.arrow', 'wb') as sink: ### no append mode yet
with pa.RecordBatchFileWriter(sink, table.schema) as writer:
writer.write_table(table)
writer.close()
if __name__ == "__main__":
main()
下面是我在命令行中使用的代码
>cat data.csv | python test.py
3条答案
按热度按时间anhgbhbe1#
正如@Pace所建议的,你应该考虑将输出文件的创建移出阅读循环,比如:
如果您希望指定特定的输入和输出文件,也不必使用
sys.stdin.buffer
。您可以运行脚本如下:通过使用
with
语句,writer
和sink
都将在之后自动关闭(在本例中,当main()
返回时),这意味着不需要包含显式的close()
调用。nue99wik2#
解决方案改编自@Martin-Evans代码:
按照@Pace的建议,在for循环后关闭文件
lx0bsm1f3#
在2023年你不需要Pandas来做这个。你可以通过csv使用箭头chunk: