【问题标题】:Errno 22 invalid mode w+ or filenameErrno 22 无效模式 w+ 或文件名
【发布时间】:2017-10-08 07:40:40
【问题描述】:
IOError: [Errno 22] invalid mode ('w+') or filename: 'hodor_2017-05-09_14:03:38.txt'

所以我在创建文件时遇到了问题,因为它是 "name" [delimiter] "datetime" .txt

我正在查找不同的代码,例如:

Turn a string into a valid filename?

python: how to convert a string to utf-8

https://github.com/django/django/blob/master/django/utils/safestring.py

它似乎仍然不适合我。

我的概念很简单:给定名称和内容,用该名称和内容编写一个文件。

我的代码是:

def create_json_file(name, contents):
    filename = u"%s_%s.json" % (name, datetime.datetime.now().strftime("%Y/%m/%d_%H:%M:%S"))
    print "%s" % filename
    filename = slugify(filename)
    f = open(filename, "w+")
    f.write(contents)
    f.close()

如您所见,我一直在调整它。我正在查找使用 slugify 的 django 所做的结果。

我的原版没有那条线。也许还有更好的方法来命名文件。我认为名称和日期时间很正常,但我不确定我应该在名称和日期时间等之间使用什么分隔符。

为了记录,我目前没有使用 Django,因为我不需要框架。我只是想测试一种传递字符串和 json 映射并将其本质上转换为config.json 文件的方法。

最终,我会想利用来自网站的 AJAX 请求来执行此操作,但这超出了本问题的范围。

【问题讨论】:

  • 这不是归结为 Windows 不允许在文件名中使用冒号吗?解决方案是使用不同的分隔符。

标签: python


【解决方案1】:

在文件名掩码中使用不同的分隔符:

filename = u"%s_%s.json" % (name, datetime.datetime.now().strftime("%Y_%m_%d_%H%M%S"))

操作系统正在尝试打开 2005/04/01_5:45:04.json。文件/目录名称中不允许使用斜线。

编辑:删除冒号以响应 cmets。

【讨论】:

  • 在 Windows 上,冒号也不是。可能会考虑改用 ISO 8601 基本格式——%Y%m%dT%H%M%S,没有冒号,没有斜杠,T 分隔日期部分和时间部分……而且,这是一个实际的标准。
  • 感谢你们俩。我知道斜线,出于某种原因,我很愚蠢,并没有想到冒号。我的错。是的,我可能只会使用 isoformat()
  • @CharlesDuffy 只是跟进,以 iso 格式执行会返回此错误IOError: [Errno 22] invalid mode ('w+') or filename: u'hodor_2017-05-10T10:23:07.057000. json' 所以它似乎不会执行标准 ISO,所以我将其移至您的格式。 Python 的字符串类默认使用的 ISO 8601 似乎是:YYYY-MM-DDTHH:MM:SS.mmmmmm。但是,使用您定义的特定格式进行操作。
  • @Fallenreaper,对,这就是我指定 ISO 8601 basic 的原因,而不是 ISO 8601 扩展(包含冒号和破折号)。
  • 是的,我只是想公开说明 Python 的 Datetime 的 isoString 函数不会返回 ISO8601 基本格式,而是扩展,因此需要使用一些格式化程序
猜你喜欢
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
相关资源
最近更新 更多