【发布时间】: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