【问题标题】:OSError: [Errno 22] Invalid argument when trying to create a fileOSError: [Errno 22] 尝试创建文件时参数无效
【发布时间】:2019-06-12 22:21:04
【问题描述】:

我正在尝试创建一个日志系统,它将程序遇到的所有异常写入一个新文件。为了实现这一点,我在创建字符串时使用了 asctime() 函数。但是,当我跑步时,我得到了这个错误:

OSError: [Errno 22] 无效参数:'C:\Users\User\Desktop\VendSend Log Wed Jun 12 17:16:56 2019.txt'

这是我的代码:

reporter_name='C:\\Users\\User\\Desktop\\VendSend Log '+time.asctime()+'.txt'

fh = open(reporter_name,'w')

fh.write('-----VENDORS WITH NO EMAILS-----')
f_len = len(vendor_removed)
fcount = 0
while fcount < f_len:
    fh.write(vendor_removed[fcount])
    fh.write()
    fcount += 1

【问题讨论】:

  • 文件名中不能有冒号。使用下划线 (_) 之类的
  • 冒号来自 asctime() 函数。我将如何更改它并继续在文件名中输入时间和日期
  • 通常,您会使用一个时间函数来返回可以在文件名中使用的内容,例如time.time。如果您希望它可读,您可以使用,例如,str.replace 删除冒号。
  • time 模块大部分被datetime 模块所取代。类似datetime.datetime.now().strftime('%Y_%m_%d_%H_%M_%S') 或iso 的快捷方式
  • @roganjosh:正要提出同样的建议。与asctime 之类的东西相比,它的优势在于该日期格式将按日期字符串按 ASCII 顺序排序,因此按文件名排序会使它们以正确的顺序排列。

标签: python


【解决方案1】:

time.asctime 返回此格式“Sun Jun 20 23:21:05 1993”。由于您在 Windows 上并且它不接受 /:*?" 或 |,因此您指定的文件名不合法。

试试 time.strftime,它会让你以任何你想要的方式格式化日期/时间。

【讨论】:

    【解决方案2】:

    文件名中的时间戳包含无效字符。使用以下命令创建可以附加到文件名的时间戳:

    import time
    timestr = time.strftime("%Y%m%d-%H%M%S")
    

    由此产生的输出可用于创建文件名。

    【讨论】:

    • 对于年月和日期之间的这个,我可以在它们之间加上“/”吗? @Roshan
    • @rmcknst2 你为什么不尝试以这种格式重命名一个新文件并找出答案?你不需要 Python --> 右键单击​​,新建文件,给它一个带有 / 的名称。看看会发生什么
    • "/" 是 Windows 中的保留字符,您可能需要对其进行转义。您可以按照@roganjosh 的建议尝试一下,还是您的意思是别的?
    【解决方案3】:

    输出包含 Windows 上文件路径的无效字符。

    尝试strftime 方法获取只包含可接受路径字符的格式。

    import time
    
    basename = "C:\\Users\\User\\Desktop\\VendSend Log "
    logname = "%s %s.txt" % (basename, time.strftime("%a %b %d %H %M %S %Y", time.localtime()))
    

    我还建议您不要在路径中使用空格(这包括文件名)。

    【讨论】:

      猜你喜欢
      • 2019-04-27
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2020-01-16
      相关资源
      最近更新 更多