Search code examples
pythonfilepython-os

Saving the .txt files in another folder in Python


Have some lightweight text search engine. It iterates through the .txt files in one folder, searches for selected term and displays the name of the file. All is based on the functionality of os library:

import os

dirname = '/Users/user/Desktop/test/reports'
save_path = '/Users/user/Desktop/test/folder'

search_terms = ['card']
search_terms = [x.lower() for x in search_terms]
Word = ''.join(search_terms)

for f in os.listdir(dirname):
    with open(os.path.join(dirname,f), "r", encoding="latin-1") as infile:
        text =  infile.read()

    if all(term in text for term in search_terms):
        print (f)
        os.path.join(save_path,f)  

3001017.txt
3003402.txt
3002866.txt
3003763.txt
3004961.txt
3003834.txt
3001986.txt

The search is working good itself but I want as a final operation save the .txt files that were received in the result in another folder save_path For that I trying to use os.path.join(save_path,f) but it seems that it is not working. What will be the right approach to do that?


Solution

  • os.path.join only merges strings to look like a path, and has nothing to do with saving data to a file.

    Refer to this example which uses the pathlib module

    In [1]: from pathlib import Path
    
    In [3]: p = Path.cwd()
    
    In [4]: p
    Out[4]: PosixPath('/home/bluesmonk')
    
    In [7]: p.stem
    Out[7]: 'bluesmonk'
    
    In [9]: p.is_dir()
    Out[9]: True
    
    In [10]: p2 = p.joinpath('foo') # path does not exist
    
    In [11]: p2.is_dir()
    Out[11]: False
    

    Note that creating p2 does not create anything in the file system.

    Regarding how to save files, you need to specify the mode as a second parameter, being 'w' the mode for writing. Check the documentation for more info.

    In [12]: with open(p.joinpath('foo.txt'), 'w') as saved_file:
        ...:     txt = 'hello world!'
                 print(saved_file)
        ...:     saved_file.write(txt)
        ...:     
    <_io.TextIOWrapper name='/home/bluesmonk/foo.txt' mode='w' encoding='UTF-8'>
    
    
    In [13]: ls
     Code/       Documents/         Library/    Public/      Vagrant/
     Desktop/    Downloads/         Music/      snap/        Videos/
     foo.txt     examples.desktop   Pictures/   Templates/  'VirtualBox VMs'/
    
    In [14]: cat foo.txt
    hello world!
    

    Your code thus would look like

    for f in os.listdir(dirname):
        with open(os.path.join(dirname,f), "r", encoding="latin-1") as infile:
            text =  infile.read()
    
        if all(term in text for term in search_terms):
            print (f)
            with open(os.path.join(save_path,f), 'w') as sf:
                sf.write(text) 
    

    Note also that pathlib exposes read_text and write_text methods, among others.