【问题标题】:Text Files Being Read in a Really Weird Manner [duplicate]以非常奇怪的方式读取文本文件[重复]
【发布时间】:2021-07-08 16:50:22
【问题描述】:

我正在使用this code,它读取给定目录中的每个文本文件:

# Import Module
import os
  
# Folder Path
path = "Enter Folder Path"
  
# Change the directory
os.chdir(path)
  
# Read text File
  
  
def read_text_file(file_path):
    with open(file_path, 'r') as f:
        print(f.read())
  
  
# iterate through all file
for file in os.listdir():
    # Check whether file is in text format or not
    if file.endswith(".txt"):
        file_path = f"{path}\{file}"
  
        # call read text file function
        read_text_file(file_path)

问题在于,它不是按时间顺序读取每个数据文件(data1.txt、data2.txt、data3.txt 等),而是以一种非常奇怪的方式读取每个文件(data1.txt、data10.txt 、data101.txt、data2.txt 等)。

为什么会这样,我该如何解决?

【问题讨论】:

  • os.listdir 返回一个列表,其中包含路径给定的目录中条目的名称,该列表按任意顺序排列。如果您希望它们按特定顺序排列,则需要对其进行排序。
  • 查看文档:docs.python.org/3/library/os.html 该列表按任意顺序排列,不包括特殊条目 '.'和 '..' 即使它们存在于目录中
  • 按字典顺序读取文件有什么奇怪的?您要求系统神奇地将每个文件名的数字部分解释为整数,并为您按该顺序对文件进行排序。您需要在文件名上插入“自然排序”。
  • @Stephen:OP 似乎认为“按时间顺序”意味着用数字表示他们不明白是什么决定了os.listdir() 返回的文件的顺序,这就是为什么它 是 i> 基本上是重复的。
  • @Alex:OP 似乎认为文件名与其创建数据有关,当然不一定总是如此。

标签: python file text


【解决方案1】:

如果您需要特定的订单,请使用它:

for root, dirs, files in os.walk(path):
   for file in sorted(files):
        print(file)

【讨论】:

    【解决方案2】:

    Python 文档对返回文件的顺序没有任何区别。更糟糕的是,它可能会因实施和操作系统而异。

    如果您想确保文件按时间顺序排列,您可以在每个文件上使用os.lstat

    sorted_list_of_files_by_modify_date = sorted(os.listdir(), key= lambda x: os.lstat(x).st_mtime)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多