如何使用 Python 获取 PickleType 数据并转换为文件夹中的 csv 文件

Posted

技术标签:

【中文标题】如何使用 Python 获取 PickleType 数据并转换为文件夹中的 csv 文件【英文标题】:How to take a PickleType data and convert to csv files in a folder using Python 【发布时间】:2022-01-15 21:07:58 【问题描述】:

我正在尝试从 sqlalchemy 获取 PickleType 数据并将其转换为文件夹中的 csv 文件。

这是我的课程的片段,其中包含 PickleType 数据:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column
from sqlalchemy.sql.sqltypes import PickleType 
Base = declarative_base()

class Sales(Base):
    .....
    data = Column(PickleType, nullable=False, comment="Sale Data for sale")

这是我试图在PickleType 中获取该数据并将其转换为文件夹中的 CSV 文件的函数

from data import Sales
import pandas as pd
import os.path
import pickle

def _to_csv(self, sales_data : Sales):
    """
    To get Sales data to output CSV files into a folder
    """
    data1 = []
    with open(sales_data.data, 'rb') as file:
        data2 = pickle.dumps(file)
        data1 = pickle.load(data2)
        df = pd.DataFrame(data1)
        df.to_csv(os.path.join('/Desktop/sales','/car_sales.csv'))
        file.close()

【问题讨论】:

您是否有需要解决的问题,或者您是否正在寻求性能提升或并行化等改进? @Dariyoush 寻求改进,如果此功能适用于将数据设置为 csv 文件到具有性能增益的目录中将是完美的! 好的,所以你将不同的数据传递给_to_csv 函数,对吧?比如说data1,data2,...你多次调用函数来保存它们。是这样吗? 是的,这是正确的,传递不同的数据,这个函数会被多次调用以保存它们 【参考方案1】:

我不知道你的类和数据的结构,但如果你有数据,你可以将它们附加到一个列表中,并同时调用你的 _to_csv 方法为你保存它。像这样的……


from data import Sales
import pandas as pd
import os.path
import pickle
import multiprocessing as mp
import concurrent.futures


def _to_csv(self, data):
    """
    To get Sales data to output CSV files into a folder
    """
    data1 = []
    with open(data 'rb') as file:
        data2 = pickle.dumps(file)
        data1 = pickle.load(data2)
        df = pd.DataFrame(data1)
        df.to_csv(os.path.join('/Desktop/sales',f'/data.csv'))
        file.close()

# I am assuming that you have the name of the files that you wanna read and save as cvs
data_list = []
for idx in range(20):
    name = f'car_salesidx'
    data_list.append(name)    

with concurrent.futures.ProcessPoolExecutor(max_workers=mp.cpu_count()) as executor:
    executor.map(_to_csv, data_list)

或者如果你想将每个数据名称分配给它的结果,你可以这样做:

with concurrent.futures.ProcessPoolExecutor(max_workers=mp.cpu_count()) as executor:
    futures =executor.submit(_to_csv, data):data for data in data_list
    for future in concurrent.futures.as_completed(futures):
        data = futures[future]
        try:
            result = future.result()
        except Exception as why:
            print('sth went wrong!', why)
        else:
            print(data, result)


【讨论】:

谢谢@Dariyoush,我想在处理file1.csv、file2.csv、file3.csv等文件时增加文件名,这看起来很棒。我的班级没有文件名。为了发生这种增量,我需要另一个循环概率? 很高兴为您提供帮助。是的,这就是我构建 data_list 的方式。你可以这样做或那样做。

以上是关于如何使用 Python 获取 PickleType 数据并转换为文件夹中的 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy:如何根据其后端有条件地选择列的类型

如何使用 Python 获取硬盘序列号

如何使用 Python 获取 GraphQL 架构?

如何使用python获取当前时间[重复]

Python[技术博客] 一些使用Python编写获取手机App日志的操作

python - 如何在python中使用不同符号分割另一个文本之后获取文本?