通过终端创建文件并在脚本python3中加入两个文件

时间:2019-01-21 19:06:29

标签: linux python-3.6

我有一个名为“ dir”的递归目录。我正在终端上的linux中使用以下命令将所有子目录中的文件列表写入CSV文件。

dir$ find . -type f -printf '%f\n' > old_names.csv

我正在使用排毒代码更改文件名。而且我正在使用

创建新列表
dir $ find . -type f -printf '%f\n' > new_names.csv

我想将其加入到列表中,并用两列创建一个新列表,如下所示;

enter image description here

为此,我将两个csv文件读入pandas数据帧,并按照以下方法在python3脚本中将它们加入索引

 import pandas as pd
 import csv

 df_old=pd.read_csv(os.path.join(somepath,'old_names.csv')
 df_new=pd.read_csv(os.path.join(somepath,'new_names.csv')
 df_names=df_new.join(df_old)

问题是我收到这样的错误文件对;

enter image description here

当我打开new_names.csv时,我看到文件列表的写入顺序与old_names列表的书写顺序不同,因此在索引上加入会导致错误的配对。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

要找出问题所在,最好先检查old_names.csv和new_names.csv,看看它们的顺序是否确实相同。如果确实存在问题,最好将文件名映射到文件的实际内容,例如校验和或类似内容。有两种方法:

方法1

用下面的脚本替换find命令。

  1. 将脚本保存在容易找到的下面,也许在目录之外的某个级别,以免被排毒。我们称之为“ get_sha_name_csv.py”。
import glob
import hashlib
import pandas
import sys

def get_df():
    '''

    :param dir_address:
    :return:
    '''
    files = glob.glob('*.*')
    hash_dict = []
    for file in files:
        with open(file, 'rb') as f:
            data = f.read()
        hash_dict.append({'sha256': hashlib.sha256(data).hexdigest(), 'filename':file})
    return pandas.DataFrame(hash_dict)

output_name = sys.argv[1]
get_df().to_csv(output_name)
  1. 从终端呼叫:
dir$ python ../get_sha_name_csv.py ../old_names.csv

第二个参数是您的输出csv文件的名称。

  1. 做排毒的东西
  2. 致电
dir$ python ../get_sha_name_csv.py ../new_names.csv
  1. 与他们合并
import pandas as pd
import csv

df_old=pd.read_csv(os.path.join(somepath,'old_names.csv')
df_new=pd.read_csv(os.path.join(somepath,'new_names.csv')
pd.merge(df_new, df_old, on='sha256', how='outer')

方法2

在python中做所有事情

import glob
import hashlib
import pandas
import os

def get_df(dir_address):
    # this function gives you the dataframe with sha256-to-filename mapping

    files = glob.glob(os.path.join(dir_address,'*.*'))
    hash_dict = []
    for file in files:
        with open(file, 'rb') as f:
            data = f.read()
        hash_dict.append({'sha256': hashlib.sha256(data).hexdigest(), 'filename':file}) # can replace with other hashfunctions
    return pandas.DataFrame(hash_dict)

def main(dir_address):
    # get old sha256-to-filename df
    df = get_df(dir_address)

    # run your detox code here, possibly with subprocess module (this part is untested)
    subprocess.run(['detox'], cwd=dir_address)

    # get new sha256-to-filename df and merge on sha256 values
    new_df = get_df(dir_address)
    output = pandas.merge(df, new_df, on='sha256', how='outer')
    print(output)

if __name__=='__main__':
    main(PUT_YOUR_DIRECTORY_LOCATION_HERE)