【问题标题】:why is Windows is truncating the name of a file I create using open() in python 3.6?为什么 Windows 会截断我在 python 3.6 中使用 open() 创建的文件的名称?
【发布时间】:2019-05-14 18:29:46
【问题描述】:

我正在尝试将 python 3.6 程序从 Ubuntu 18 移植到 Windows 10。在此文件中,我正在创建一个包含日期时间对象的长字符串并将其用作文件名。 open() 命令在 ubuntu 中运行良好,并创建了一个以“.txt”结尾的长字符串,但是 Windows 10 不喜欢这样,并将文件名截断为 32 位(我不确定这是故意还是巧合。)代码相同,但操作系统处理方式不同。这是代码:


    # Capture the date time object format to write to log file
    datetime_object = datetime.datetime.now().strftime("%I:%M%p on %B %d, %Y")
    print(datetime_object)
    Error_file_name = "ESP32_Company_Error_log_" + datetime_object + ".txt"
    print(Error_file_name)
    Info_file_name = "ESP32_Company_Information_log_" + datetime_object + ".txt"


    #Open the files to write 
    err_fl = open(Error_file_name, "a")
    #print(type(err_fl))
    info_fl = open(Info_file_name, "a")

Windows 将创建一个通用文件


ESP32_Company_Information_log_11

这不是 .txt 文件,因此以后不要打开它。 Ubuntu 创建 "ESP32_Company_Information_log_11:15AM on May 14, 2019.txt"

我试过 import os,没用。我查看了类型,但无法弄清楚为什么文本 IO 包装器会有这个。

【问题讨论】:

  • Windows 禁止在文件名中使用“:”。虽然截断的行为很奇怪。
  • 我不得不再看一遍。你是对的,冒号“:”是不允许的。更改此修复它
  • 我总是正确的,除非我错了。很高兴它有效。 :) 我实际上意识到为什么文件名被截断,因为这是这里的主要心理练习,NTFS 允许在打开此类流时实际由文件名中的“:”标识的备用数据流。
  • @rAndom69,澄清一下,“:”是文件路径的一部分,而不是文件名。 NTFS 文件的完整规范是“filename:streamname:streamtype”。例如,一个名为“dirname”的目录实际上是一个名为“$I30”的索引流,即“dirname:$I30:$INDEX_ALLOCATION”。 (文件的名称属性的内部代码是 0x30,因此流名称“$I30”表示它是文件名索引。还有其他通常看不到的索引类型,例如“\$Extend\$Reparse :$R:$INDEX_ALLOCATION" 重解析点的索引。)
  • 另外,Windows 不禁止在文件名中使用“:”。 Microsoft 的文件系统禁止它,因为它与file streams 冲突并导致设备名称含糊不清(例如“C:”​​和“NUL:”)。第三方文件系统可以允许它。例如,VirtualBox 的共享文件夹文件系统允许文件名中包含冒号,以及管道和 ASCII 控制字符。

标签: python-3.x windows ubuntu


【解决方案1】:

看来日期时间格式很重要 rAndom69 你是正确的。更改格式解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-15
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2012-04-11
    • 1970-01-01
    相关资源
    最近更新 更多