Python 3中使用with open()合并上级目录txt文件时遭遇FileNotFoundError问题求助
Python 3中使用with open()合并上级目录txt文件时遭遇FileNotFoundError问题求助
嘿,我太懂你这种明明文件名都列出来了,却打不开文件的困惑了!问题的核心其实很简单——你拿到的只是文件名,没有告诉Python文件所在的完整路径。
你用os.listdir("../notes")获取的是notes目录下的纯文件名,比如'File bard Mar 30 2023, 4 30 48 PM.txt',但当你直接调用open(file, 'r')时,Python会默认在当前脚本所在的目录下去找这个文件,而不是去上级的notes目录里找,这就导致了FileNotFoundError。
下面给你两种实用的解决办法:
方法一:拼接完整文件路径(推荐)
最稳妥的方式是把上级目录的路径和文件名拼接成完整路径,这样Python就能精准定位到文件了。我们可以用os.path.join()来做这件事,它会自动适配不同操作系统的路径分隔符,避免手动拼接出错。
修改后的完整代码如下:
import os def main(): # Get list of files stored in a dir above this .py's dir folder = os.listdir("../notes") # Merge the files merge_files(folder) def merge_files(folder): # Create a list to store the names of the files files_names = [] # 定义上级notes目录的相对路径 notes_directory = "../notes" # 用w模式每次生成全新合并文件,a模式为追加模式 with open("merged_notes.txt", "w") as outfile: # Iterate through the list of files for file in folder: # Add name of file to list files_names.append(file) print(files_names) # 拼接完整的文件路径 full_file_path = os.path.join(notes_directory, file) # Open input file in read mode with open(full_file_path, "r") as infile: # Read data from input file data = infile.read() # Write data to output file (file name, data, new line) outfile.write(file) outfile.write(data) outfile.write("\n") # Return merged file return "merged_notes.txt" if __name__ == "__main__": main()
方法二:临时切换工作目录(可选)
你也可以先让Python切换到../notes目录下再操作文件,但这种方法需要注意操作完切回原目录,否则后续的文件操作可能会受影响:
import os def main(): folder = os.listdir("../notes") merge_files(folder) def merge_files(folder): files_names = [] # 保存当前工作目录 original_dir = os.getcwd() # 切换到上级notes目录 os.chdir("../notes") # 要写入的合并文件需要用原目录的路径,否则会生成在notes目录下 with open(os.path.join(original_dir, "merged_notes.txt"), "w") as outfile: for file in folder: files_names.append(file) print(files_names) with open(file, "r") as infile: data = infile.read() outfile.write(file) outfile.write(data) outfile.write("\n") # 切回原来的工作目录 os.chdir(original_dir) return "merged_notes.txt" if __name__ == "__main__": main()
最后提个小细节:你原来用的是open("merged_notes.txt", "a")(追加模式),如果多次运行脚本,合并内容会不断叠加。要是你希望每次运行都生成全新的合并文件,建议改成"w"(写入模式),这样每次都会覆盖之前的内容。
备注:内容来源于stack exchange,提问作者Lele
相关产品推荐
相关产品推荐

