Python - 根据内容分隔文件
Python - separate files based on their content
我试图根据位于文本文件中的字符串(国家/地区 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 国家/地区的文件夹
我不得不为您稍微编辑一下这个主题,以便现在了解我的问题:)
我认为问题在于您创建源代码的方式。根据你的代码来源是:
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)
现在我们正在逐个文件移动。这应该按预期工作
我试图根据位于文本文件中的字符串(国家/地区 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 国家/地区的文件夹
我不得不为您稍微编辑一下这个主题,以便现在了解我的问题:)
我认为问题在于您创建源代码的方式。根据你的代码来源是:
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)
现在我们正在逐个文件移动。这应该按预期工作