Python-如何在不创建文件的情况下制作CSV数据示例?

Python-如何在不创建文件的情况下制作CSV数据示例?,python,pandas,dataframe,csv,unit-testing,Python,Pandas,Dataframe,Csv,Unit Testing,我想测试连接多个CSV文件以生成单个数据帧: pd_df = pd.concat(pd.read_csv(f, header=0) for f in csv_files_data) 这导致ValueError:无效的文件路径或缓冲区对象类型: 我正在创建如下CSV数据示例: csv_data_1 = [['ID', 'Metric_1', 'ProcessDate'], ['1', '-10.5', '1/12/2007'],

我想测试连接多个CSV文件以生成单个数据帧:

pd_df = pd.concat(pd.read_csv(f, header=0) for f in csv_files_data)
这导致ValueError:无效的文件路径或缓冲区对象类型:

我正在创建如下CSV数据示例:

csv_data_1 = [['ID', 'Metric_1', 'ProcessDate'],
                      ['1', '-10.5', '1/12/2007'],
                      ['2', '25.0', '1/22/2010']]
csv_data_2 = [['ID', 'Metric_1', 'ProcessDate'],
                      ['3', '7.9', '10/14/2015'],
                      ['4', '50.0', '5/19/2020']]

csv_files_data = [csv_data_1, csv_data_2]

我故意不读取csv文件,并试图在测试代码中创建数据示例。有没有一种方法可以正确创建这样的CSV示例,我可以将其传递给pd.read\u CSV

此代码是否适合您的需要

pd_df = pd.concat(pd.DataFrame(f) for f in csv_files_data)
该方法适用于文件对象或缓冲区

编辑: 您可以将列表转储到数据文件对象中,如果您不介意使用numpy,那么这是一个解决方案:

from tempfile import TemporaryFile

fil_data_1 = TemporaryFile()
fil_data_2 = TemporaryFile()

csv_data_1 = np.array(csv_data_1)
csv_data_2 = np.array(csv_data_2)

np.savetxt(fil_data_1, csv_data_1, fmt='%s %s %s')
np.savetxt(fil_data_2, csv_data_2, fmt='%s %s %s')

# Simulate closing and reopening of files
_ = fil_data_1.seek(0)
_ = fil_data_2.seek(0)

pd_df = pd.concat(pd.read_csv(f, header=0) for f in [fil_data_1, fil_data_2])
上面的代码使用模块生成临时文件 其中可以转储从列表生成的numpy数组。相应的输出为:

      ID    Metric_1    ProcessDate
0     1     -10.5           1/12/2007
1     2      25.0           1/22/2010
0     3      7.9            10/14/2015
1     4      50.0           5/19/2020

此代码是否适合您的需要

pd_df = pd.concat(pd.DataFrame(f) for f in csv_files_data)
该方法适用于文件对象或缓冲区

编辑: 您可以将列表转储到数据文件对象中,如果您不介意使用numpy,那么这是一个解决方案:

from tempfile import TemporaryFile

fil_data_1 = TemporaryFile()
fil_data_2 = TemporaryFile()

csv_data_1 = np.array(csv_data_1)
csv_data_2 = np.array(csv_data_2)

np.savetxt(fil_data_1, csv_data_1, fmt='%s %s %s')
np.savetxt(fil_data_2, csv_data_2, fmt='%s %s %s')

# Simulate closing and reopening of files
_ = fil_data_1.seek(0)
_ = fil_data_2.seek(0)

pd_df = pd.concat(pd.read_csv(f, header=0) for f in [fil_data_1, fil_data_2])
上面的代码使用模块生成临时文件 其中可以转储从列表生成的numpy数组。相应的输出为:

      ID    Metric_1    ProcessDate
0     1     -10.5           1/12/2007
1     2      25.0           1/22/2010
0     3      7.9            10/14/2015
1     4      50.0           5/19/2020

您可以手动将列表转换为符合要求的csv字符串,然后将其写入io流:

输入io 作为pd进口熊猫 def列出了_至_CSV列表: 从每个列表中创建一个逗号分隔的字符串, 然后用换行符连接字符串 行='\n'。连接[','。连接[el代表行中的el]代表列表中的行] 返回io.StringIOlines csv_数据_1=[['ID','Metric_1','ProcessDate'], ['1', '-10.5', '1/12/2007'], ['2', '25.0', '1/22/2010']] csv_data_2=[['ID','Metric_1','ProcessDate'], ['3', '7.9', '10/14/2015'], ['4', '50.0', '5/19/2020']] csv_文件_数据=[csv_数据_1、csv_数据_2中数据的列表_至_csvdata] pd_df=pd.concatpd.read_csvf,头=0表示csv_文件_数据中的f printpd_df 这将产生:

   ID  Metric_1 ProcessDate
0   1     -10.5   1/12/2007
1   2      25.0   1/22/2010
0   3       7.9  10/14/2015
1   4      50.0   5/19/2020

您可以手动将列表转换为符合要求的csv字符串,然后将其写入io流:

输入io 作为pd进口熊猫 def列出了_至_CSV列表: 从每个列表中创建一个逗号分隔的字符串, 然后用换行符连接字符串 行='\n'。连接[','。连接[el代表行中的el]代表列表中的行] 返回io.StringIOlines csv_数据_1=[['ID','Metric_1','ProcessDate'], ['1', '-10.5', '1/12/2007'], ['2', '25.0', '1/22/2010']] csv_data_2=[['ID','Metric_1','ProcessDate'], ['3', '7.9', '10/14/2015'], ['4', '50.0', '5/19/2020']] csv_文件_数据=[csv_数据_1、csv_数据_2中数据的列表_至_csvdata] pd_df=pd.concatpd.read_csvf,头=0表示csv_文件_数据中的f printpd_df 这将产生:

   ID  Metric_1 ProcessDate
0   1     -10.5   1/12/2007
1   2      25.0   1/22/2010
0   3       7.9  10/14/2015
1   4      50.0   5/19/2020

然后可能使用文件对象列表?是否可以将我的数据样本传递到缓冲区?@samba我已经编辑了我的答案。现在,列表被转储到文件对象中,然后由pandas处理。希望能有帮助。那么也许可以使用文件对象列表?可以将我的数据样本传递到缓冲区吗?@samba我已经编辑了我的答案。现在,列表被转储到文件对象中,然后由pandas处理。希望有帮助。