在熊猫数据框中存储超过一百万个.txt文件

时间:2019-01-06 05:40:20

标签: python pandas sqlite

我有一套超过.txt格式的记录超过一百万条。每个file.txt只有一行:

  

“用户名”,“用户昵称”,24、45

我需要对百万个文件中数字特征的聚合列表进行分布检查。因此,我需要将这些文件聚合为大数据帧。我一直遵循的方法如下:

import glob
import os
import pandas as pd

import sqlite3

connex = sqlite3.connect("data/processed/aggregated-records.db")

files_lst = glob.glob("data/raw/*.txt")

files_read_count = 1

for file_name in files_lst:
    data_df = pd.read_csv(file_name, 
                          header=None, 
                          names=['user_name', 'user_nickname',  
                                 'numeric_1', 'numeric_2'])

    data_df['date_time'] = os.path.basename(file_name).strip(".txt")

    data_df.to_sql(name=file_name, con=connex, if_exists="append", index=False)

    files_read_count += 1

    if (files_read_count % 10000) == 0:
        print(files_read_count, " files read")

我的问题是,使用这种方法,我能够以非常慢的速度(每小时大约10,000个文件)写入数据库。有什么办法可以更快地运行吗?

2 个答案:

答案 0 :(得分:2)

以下代码将处理时间缩短为每分钟10,000个文件。这是@DYZ here的建议的实现。

import csv, glob

with open('data/processed/aggregated-data.csv', 'w') as aggregated_csv_file:
    writer = csv.writer(aggregated_csv_file, delimiter=',')

    files_lst = glob.glob("data/raw/*.txt")

    files_merged_count = 1

    for file in files_lst:

        with open(file) as input_file:

            csv_reader = csv.reader(input_file, delimiter=',')

            for row in csv_reader:
                writer.writerow(row)

        if (files_merged_count % 10000) == 0:
            print(files_merged_count, "files merged")

        files_merged_count += 1

答案 1 :(得分:1)

如果您使用的是Unix,则可以先尝试使用Shell脚本将文件串联起来,然后再读取最终的结果文件。

例如find -name '*.txt' -type f -exec cat {} \; > combinedfile.txt

现在您可以使用熊猫或其他任何方式将其移动到数据库中。