Python Recursive Folder Reading: Overcoming Shallow Exploration
In the realm of programming, it's often challenging to navigate complex hierarchical structures efficiently. For a budding Python enthusiast with a C /Obj-C background, recursively traversing a folder structure to read the contents of text files can pose a formidable obstacle.
Let's delve into the code you provided to understand the limitations inhibiting its recursion beyond a single folder depth:
<code class="python">import os import sys rootdir = sys.argv[1] for root, subFolders, files in os.walk(rootdir): for folder in subFolders: outfileName = rootdir + "/" + folder + "/py-outfile.txt" # hardcoded path folderOut = open( outfileName, 'w' ) print "outfileName is " + outfileName for file in files: filePath = rootdir + '/' + file f = open( filePath, 'r' ) toWrite = f.read() print "Writing '" + toWrite + "' to" + filePath folderOut.write( toWrite ) f.close() folderOut.close()</code>
The culprit lies in the hardcoded path for filePath:
<code class="python">filePath = rootdir + '/' + file</code>
This code assumes a fixed depth of one folder, preventing it from correctly extracting file paths within nested folders. To rectify this issue, we need to incorporate the current root value, which provides the path of the currently iterated folder:
<code class="python">filePath = os.path.join(root, file)</code>
By utilizing os.path.join, we construct an accurate full file path, allowing the code to successfully explore all levels of the folder structure.
Additionally, it's prudent to employ the with statement for handling file operations, which ensures automatic file closure, enhancing code readability and reducing potential resource leaks.
Here's a revised version of the code that addresses these issues:
<code class="python">import os import sys walk_dir = sys.argv[1] print('walk_dir = ' + walk_dir) # Converting to absolute path ensures portability walk_dir = os.path.abspath(walk_dir) print('walk_dir (absolute) = ' + walk_dir) for root, subdirs, files in os.walk(walk_dir): print('--\nroot = ' + root) list_file_path = os.path.join(root, 'my-directory-list.txt') print('list_file_path = ' + list_file_path) with open(list_file_path, 'wb') as list_file: for subdir in subdirs: print('\t- subdirectory ' + subdir) for filename in files: file_path = os.path.join(root, filename) print('\t- file %s (full path: %s)' % (filename, file_path)) with open(file_path, 'rb') as f: f_content = f.read() list_file.write(('The file %s contains:\n' % filename).encode('utf-8')) list_file.write(f_content) list_file.write(b'\n')</code>
With these modifications, your Python code will
The above is the detailed content of How to Recursively Traverse a Folder Structure to Read Text File Contents in Python?. For more information, please follow other related articles on the PHP Chinese website!