将选定的行从不同目录中的文件复制到另一个文件

时间:2017-11-08 11:23:40

标签: python python-2.7 copy file-copying

我有一个包含许多子目录的目录,包含文件。我想打开以" root.vrpj"结尾的文件。或" root.vprj"," App_integrations"文件夹并复制包含单词" table"的行。到另一个文件。

到目前为止,我已设法使用以下代码访问每个文件:

for root, dirs, files in os.walk(movedir):
for filename in files:
    if filename.endswith(("root.vrpj", "root.vprj")):

问题是,我现在拥有的只是我想访问的文件的名称,而且我被困在这里。

4 个答案:

答案 0 :(得分:1)

你可以试试这个:

f = open('final_file.txt', 'w')
for root, dirs, files in os.walk(movedir):
   for filename in files:
      if filename.endswith("root.vrpj") or  filename.endswith("root.vprj"):
         with open(filename) as data:
            for line in data:
               if "table" in data:
                   f.write('{}\n'.format(data))
f.close()

答案 1 :(得分:0)

这是Ajax的一个版本'用于关闭您在循环中打开的文件的代码(并修复了其他一些小问题):

with open('final_file.txt', 'w') as f:
    for root, dirs, files in os.walk(movedir):
        for filename in files:
            if filename.endswith(("root.vrpj"), ("root.vprj")):
                with open(os.path.join(root, filename)) as finput:
                     for line in finput:
                         if 'table' in line:
                             f.write(line)

但是,当你看到8个级别的缩进时,你需要重构,例如:

def find_files(startdir, *extensions):
    for root, dirs, files in os.walk(movedir):
        for filename in files:
            if filename.endswith(extensions):
                yield os.path.join(root, filename)

def find_lines(fname, text):
    with open(fname) as fp:
         return [line for line in fp if text in line]

with open('final_file.txt', 'w') as f:
    for fname in find_files(movedir, 'root.vrpj', 'root.vprj'):
        f.writelines(find_lines(fname, 'table'))

答案 2 :(得分:0)

我终于解决了它

    import os

rootdir = my root folder

# creates a file f that contains all the lines of the files 
# with "root.vrpj" or "root.vprj" in their name
# and who are inside "App_integrations" folders
# without duplicates

#creating the big file with all the file containing the lines I need
f = open('final_file.txt', 'a')
for root, dirs, files in os.walk(rootdir):  
    for filename in files:
        if (filename.endswith(("root.vrpj", "root.vprj")) and ("App_Integration" in os.path.join(root, filename))):
            full_name = os.path.join(root, filename) 
            data = open(full_name).read()
            f.write(data + "\n")                 
f.close()

#copying the lines I need to f1 without duplicates
lines_seen = set()
f = open('final_file.txt')
f1 = open('testread1.txt', 'a')
doIHaveToCopyTheLine=False
for line in f.readlines():
    if (("Table" in line) and (line not in lines_seen)):
        doIHaveToCopyTheLine=True
        if doIHaveToCopyTheLine:
            f1.write(line)
            lines_seen.add(line)
f1.close()
f.close()

答案 3 :(得分:0)

查找文件

from pathlib import Path
import itertools

source_dir = Path(<source_dir>)

patterns = ['**/*root.vrpj', '**/*root.vprj']

files = itertools.chain.from_iterables(source_dir.glob(pat) for pat in patterns)) 

过滤文件:

def filter_lines(files):
    for file in files:
        if not 'App_Integration' in file.parts:
            continue
        with file.open('r') as file_handle:
            for line in file_handle:
                if 'table' in line:
                    yield line

写出输出

def save_lines(lines, output_file=sys.std_out):
    for line in lines:
        output_file.write(line)

with Path(<output_file>).open('w') as output_file:
    save_lines(filter_lines(files), as output_file)