Python如何检查文件名是否在UTF8中?

Phyton_user

我有一个PHP脚本,该脚本可以在目录中创建文件列表,但是PHP只能看到英语的文件名,而完全忽略其他语言(如俄语或亚洲语言)的文件名。

经过大量的努力,我找到了唯一适用于我的解决方案-使用python脚本将文件重命名为UTF8,因此PHP脚本可以在此之后对其进行处理。

(在PHP完成文件处理之后,我将文件重命名为英语,而不是将它们保留在UTF8中)。

我使用以下python脚本,效果很好:

import sys
import os
import glob
import ntpath
from random import randint

for infile in glob.glob( os.path.join('C:\\MyFiles', u'*') ):
    if os.path.isfile(infile):
      infile_utf8 = infile.encode('utf8')
      os.rename(infile, infile_utf8)

问题在于它还会转换UTF8中已经存在的文件名。如果文件名已经在UTF8中,我需要一种跳过转换的方法。

我正在尝试以下python脚本:

for infile in glob.glob( os.path.join('C:\\MyFiles', u'*') ):
    if os.path.isfile(infile):
      try:
        infile.decode('UTF-8', 'strict')
      except UnicodeDecodeError:
        infile_utf8 = infile.encode('utf8')
        os.rename(infile, infile_utf8)    

但是,如果文件名已经在utf8中,则会出现致命错误:

UnicodeDecodeError: 'ascii' codec can't decode characters in position 18-20
ordinal not in range(128)

我还尝试了另一种方法,但也没有用:

for infile in glob.glob( os.path.join('C:\\MyFiles', u'*') ):
    if os.path.isfile(infile):
      try:
        tmpstr = str(infile)
      except UnicodeDecodeError:
        infile_utf8 = infile.encode('utf8')
        os.rename(infile, infile_utf8)      

我得到了和以前完全一样的错误。

有任何想法吗?

Python对我来说是一个非常新的东西,即使调试一个简单的脚本也需要付出巨大的努力,因此请编写一个明确的答案(即代码)。我没有能力测试可能有用或无效的一般想法。谢谢。

文件名示例:

 hello.txt
 你好.txt
 안녕하세요.html
 chào.doc
阿拉斯泰尔·麦考马克

我认为您在混淆术语并做出一些错误的假设。AFAIK,PHP可以打开任何编码类型的文件名-PHP与编码类型无关。

您还不清楚要使用UTF-8来实现什么目标!==英语,并且示例外部文件名可能以多种方式编码,但从来没有采用ASCII英文!您能否解释一下您认为现有UTF-8文件的外观以及非UTF-8文件的外观?

更令人困惑的是,在Windows下,文件名透明存储为UTF-16。因此,您不应尝试将文件名编码为UTF-8。相反,您应该使用Unicode字符串,并允许Python进行正确的转换。(也不使用UTF-16编码!)

请进一步阐明您的问题。

更新

我现在了解您的PHP问题。http://evertpot.com/filesystem-encoding-and-php/告诉我们非拉丁字符在PHP + Windows上很麻烦。似乎只能看到和打开Windows 1252字符集字符组成的文件。

您面临的挑战是将文件名转换为与Windows 1252兼容。正如您在问题中所说的那样,最好不要重命名已经兼容的文件。我将您的尝试重新设计为:

import os
from glob import glob
import shutil
import urllib

files = glob(u'*.txt')
for my_file in files:
    try:
        print "File %s" % my_file
    except UnicodeEncodeError:
        print "File (escaped): %s" % my_file.encode("unicode_escape")
    new_name = my_file
    try:
        my_file.encode("cp1252" , "strict")
        print "    Name unchanged. Copying anyway"
    except UnicodeEncodeError:
        print "    Can not convert to cp1252"
        utf_8_name = my_file.encode("UTF-8")
        new_name = urllib.quote(utf_8_name )
        print "    New name: (%% encoded): %s" % new_name
    
    shutil.copy2(my_file, os.path.join("fixed", new_name))

分解:

  1. 打印文件名。默认情况下,Windows Shell仅在本地DOS代码页中显示结果。例如,我的外壳可以显示,ü.txt€.txt显示为?.txt因此,您需要注意Python抛出异常,因为它无法正确打印。此代码尝试打印Unicode版本,但改为打印Unicode代码点转义符。

  2. 尝试将字符串编码为Windows-1252。如果可行,则文件名正常

  3. 否则:将文件名转换为UTF-8,然后对其进行百分比编码。这样,文件名保持唯一,您可以在PHP中逆转此过程。

  4. 将文件复制到新文件/已验证文件。

例如,你好.txt变成%E4%BD%A0%E5%A5%BD.txt

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何检查目录中是否存在文件名?

来自分类Dev

如何检查目录中是否存在文件名?

来自分类Dev

如何在python中以utf-8格式写入文件名?

来自分类Dev

如何检查ETL中文件名的前8位是否存在文件?

来自分类Dev

jplayer utf8文件名mp3问题

来自分类Dev

如何检查awk中是否存在文件?[-d'文件名']失败

来自分类Dev

如何使用文件名检查(内部/外部存储)中是否存在文件?

来自分类Dev

如何将 iso8859_6 中的文件名转换为 utf-8?

来自分类Dev

如何在Java中检查文件名中是否包含日期?

来自分类Dev

如何检查文件名是否符合模式?

来自分类Dev

如何检查文件名是否与Shell脚本中的正则表达式匹配

来自分类Dev

如何在C中检查文件名是否为目录?

来自分类Dev

如何检查文件名是否包含Firebase存储安全规则中的uid?

来自分类Dev

检查文件名中是否包含字符串

来自分类Dev

Windows文件名-如何检查文件名是否有效?

来自分类Dev

如何检查参数是否同时具有文件名和路径或仅文件名

来自分类Dev

在 Windows 中,如何检查包含 utf8 文本的 std::string 是否以大写字母开头?

来自分类Dev

检查文件名是否存在并在Google脚本中更新文件名

来自分类Dev

UTF 8文件名?

来自分类Dev

boost.log在使用UTF8文件名创建文件时出现问题

来自分类Dev

如何检查文件夹中是否存在重复文件,而不使用glob / listdir / etc。比较文件名?

来自分类Dev

如何检查目录中的音频文件是否与数据库中存储的文件名匹配

来自分类Dev

C#-如何检查某个目录中是否存在文件(基于其内容,而不是文件名)?

来自分类Dev

如何通过文件名(无扩展名)检查文件是否存在?

来自分类Dev

XML文件中的UTF-8与UTF8

来自分类Dev

Snowflake中是否存在查询以标识文件中无效utf8的字符

来自分类Dev

如何检测文件名中是否存在空格?

来自分类Dev

检查文件夹中的任何文件是否包含模式,然后返回文件名

来自分类Dev

python:检查文件名是否是另一个文件名的子字符串

Related 相关文章

  1. 1

    如何检查目录中是否存在文件名?

  2. 2

    如何检查目录中是否存在文件名?

  3. 3

    如何在python中以utf-8格式写入文件名?

  4. 4

    如何检查ETL中文件名的前8位是否存在文件?

  5. 5

    jplayer utf8文件名mp3问题

  6. 6

    如何检查awk中是否存在文件?[-d'文件名']失败

  7. 7

    如何使用文件名检查(内部/外部存储)中是否存在文件?

  8. 8

    如何将 iso8859_6 中的文件名转换为 utf-8?

  9. 9

    如何在Java中检查文件名中是否包含日期?

  10. 10

    如何检查文件名是否符合模式?

  11. 11

    如何检查文件名是否与Shell脚本中的正则表达式匹配

  12. 12

    如何在C中检查文件名是否为目录?

  13. 13

    如何检查文件名是否包含Firebase存储安全规则中的uid?

  14. 14

    检查文件名中是否包含字符串

  15. 15

    Windows文件名-如何检查文件名是否有效?

  16. 16

    如何检查参数是否同时具有文件名和路径或仅文件名

  17. 17

    在 Windows 中,如何检查包含 utf8 文本的 std::string 是否以大写字母开头?

  18. 18

    检查文件名是否存在并在Google脚本中更新文件名

  19. 19

    UTF 8文件名?

  20. 20

    boost.log在使用UTF8文件名创建文件时出现问题

  21. 21

    如何检查文件夹中是否存在重复文件,而不使用glob / listdir / etc。比较文件名?

  22. 22

    如何检查目录中的音频文件是否与数据库中存储的文件名匹配

  23. 23

    C#-如何检查某个目录中是否存在文件(基于其内容,而不是文件名)?

  24. 24

    如何通过文件名(无扩展名)检查文件是否存在?

  25. 25

    XML文件中的UTF-8与UTF8

  26. 26

    Snowflake中是否存在查询以标识文件中无效utf8的字符

  27. 27

    如何检测文件名中是否存在空格?

  28. 28

    检查文件夹中的任何文件是否包含模式,然后返回文件名

  29. 29

    python:检查文件名是否是另一个文件名的子字符串

热门标签

归档