【问题标题】:Python - separate files based on their contentPython - 根据内容分离文件
【发布时间】:2015-10-22 11:05:40
【问题描述】:

我尝试根据文本文件中的字符串(国家 ISO)将文件夹(连同其内容)移动到新位置。

文本文件如下所示

S0M6A36A108A180A252A324A36|1|48|89|36|Single|
S0M6A36A108A180A252A324A36|2|43|83|108|Single|
S0M6A36A108A180A252A324A36|3|37|85|180|Single|
S0M6A36A108A180A252A324A36|4|37|93|252|Single|
S0M6A36A108A180A252A324A36|5|43|95|324|Single|
S0M6A36A108A180A252A324A36|6|42|89|36|Single|

[META DATA]
01/10/2015|14:50:27|USA|UWI_N2C34_2|MMS1|FORD35|Bednarek|true|6|0|false|

[QUALITY CAMERA CHECK]
1|1|0|
2|1|0|
3|1|0|
4|1|0|
5|1|0|
6|1|0|

[PRESET]
S0M6A36A108A180A252A324A36|TA|

我读了iso国家所在的行(在本例中为|USA|01/10/2015|14:50:27|USA|UWI_N2C34_2|MMS1|FORD35|Bednarek|true|6|0|false|

为此,我尝试使用作为正则表达式一部分的函数组。我推断我需要从包含该字符串的特定行中读取。于是我写了小代码:

#-------------------------------------------------------------------------------
import os
import string
import re
import sys
import glob
import fileinput
import shutil

country_pattern = 'MYS','IDN','ZAF', 'THA','TWN','SGP','CYP', 'NWZ', 'AUS','ALB','AUT','BEL', 'BGR', 'BIH', 'CHE','CZE', 'DEU', 'DNK', 'URY', 'ESP','EST','SRB','MDK','MNE','BIH', 'BIH','MNE','FIN', 'FRA', 'GBR','GRC', 'HRV', 'HUN', 'IRL', 'ITA', 'LIE', 'LTU', 'LUX', 'LVA', 'MDA', 'SMR','CYP','NLD','NOR','POL','PRT','ROU','SCG', 'SVK','SVN','SWE','TUR','BRA','CAN','USA','MEX','CHL','ARG','RUS'
pattern = r'(\d+)/(\d+)/(\d+)\|(\d+):(\d+):(\d+)\|(\S+)\|(\S+)\|(\S+)\|(\S+)\|(\S+)\|(\S+)\|(\d+)\|(\d+)\|(\S+)\|'


src = raw_input("Enter source disk location: ")
src = os.path.dirname(src)
for dir,_,_ in os.walk(src): 
    file_path = glob.glob(os.path.join(dir,"*.txt")) 
    print "file_path", file_path



    for file in file_path: 
    f = open(file, 'r')
    object_name = f.readlines()
    f.close()

    part = os.path.dirname(os.path.dirname(file)) 
    part_file1 = os.path.basename(part)
    part_file2 = os.path.split(part)[0] 
    print "part_file2: ", part_file2
    part_file3 = os.path.split(part)[1]
    print "part_file3: ", part_file3
    source = os.path.join(part_file2, part_file3)
    print "src", source
    file_source = glob.glob(os.path.join(source,dir))
    print "file_source", file_source
    for element in file_source: 
        final_file_source = element


    for line_name_tmp in object_name:
        line_name = line_name_tmp.replace(' ','')
        #line_name = line_name_tmp.replace('\n','')
        if line_name == '':
            line_name.split()
            continue
        else:
            pass
            try:
                searchObj = re.search(pattern, line_name)
                m = searchObj.group(7) 
                print "KRAJ : ", m
                if m in country_pattern:
                    path = os.path.join(part_file2, m)
                    print "PATH", path
                    print "ELEMENT", element

                    if not os.path.exists(path):
                        os.makedirs(path)
                    else:
                        pass
                    shutil.copy(element,path)
                else:
                    print 'did not find any match'
            except:
                print line_name
                pass

目前,我可以在文本文件中使用基于国家 ISO 的名称自动创建空文件夹。我尝试将包含其内容的文件夹移动到基于其国家/地区 iso 的位置。

我尝试使用函数“shutil.copy”但没有任何反应。

我试图做的是移动文件夹,如果它们在字符串中包含不同的国家,并将它们分开到不同的位置。 我希望你们能理解我的问题。我知道这很复杂:)

基本目录也是这样的:

E:\data\WE244JP_2015_04_01__13_43_59\WE244JP_2015_04_01__13_43_5.txt
E:\data\WE244JP_2015_04_01__14_43_59\WE244JP_2015_04_01__14_43_5.txt
E:\data\WE244JP_2015_04_01__15_43_59\WE244JP_2015_04_01__15_43_5.txt'

我尝试将文件夹(连同其内容)E:\data\WE244JP_2015_04_01__15_43_59 在此级别上移动到基于 txt 中的国家/地区的文件夹

我不得不为你编辑这个主题,以便现在了解我的问题:)

【问题讨论】:

  • 因此,您正在查看所有文件,检查包含国家代码的行 - 然后您想将刚刚检查的文件移动到另一个文件夹。对吗?
  • 正是我需要的。我想将它移动到另一个与文本文件中的国家/地区同名的文件夹
  • 嗨,有谁能告诉我如何解决这个问题。 :) 谢谢

标签: python python-2.7 shutil os.path


【解决方案1】:

我认为问题在于您创建源代码的方式。根据你的代码来源是:

source = part_file2 + paryt_file3 = '//'

假设你的路径是 C/D/E.txt 那么:

part = C/D/
part_file1 = E.txt #file you are working on
part_file2 = C
part_file3 = D
source = CD// #plus operator does a simple concatenation.   

现在您正试图移动这个甚至不存在的源文件夹。这就是问题所在。

编辑: shutil.move() 将始终移动您编写的代码的整个目录。如果您只想移动文件,请使用以下代码:

src_files = os.listdir(src)
for file_name in src_files:
    file_path = os.path.join(src, file_name)
    if (os.path.isfile(file_path)):
        shutil.move(file_path, path)

现在我们正在逐个文件移动。这应该可以按预期工作

【讨论】:

  • 好的,我将这一行修改为:source = os.path.join(part_file2, part_file3),但它仍然没有移动文件夹的内容,而是移动了我不想要的整个文件夹。如何移动文件内容?
  • shutil.move 将始终移动整个目录。如果您只想移动文件;使用我在编辑答案时编写的代码。
  • 我找到了这条信息-也许它会帮助我-? def ignore_pyc_files(dirname, filenames .. - source safaribooksonline.com/library/view/python-cookbook-3rd/…
  • 如果有帮助,请点击旁边的正确标记接受答案。你也可以选择点赞
猜你喜欢
  • 2019-09-12
  • 1970-01-01
  • 2017-04-27
  • 2019-02-02
  • 1970-01-01
  • 2023-03-15
  • 2021-09-08
  • 2010-11-30
  • 2015-11-14
相关资源
最近更新 更多