GVKun编程网logo

Python如何检查文件名是否在UTF8中?(python判断文件名)

20

以上就是给各位分享Python如何检查文件名是否在UTF8中?,其中也会对python判断文件名进行解释,同时本文还将给你拓展bash–如何检查文件名是否与shell脚本中的regex匹配、pytho

以上就是给各位分享Python如何检查文件名是否在UTF8中?,其中也会对python判断文件名进行解释,同时本文还将给你拓展bash – 如何检查文件名是否与shell脚本中的regex匹配、python – 如何检查特定数字是否在整数中、python – 检查文件名是否有效、python 乱码,python 编码,python 中文编码转换,python utf-8,python utf8,python unicode等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Python如何检查文件名是否在UTF8中?(python判断文件名)

Python如何检查文件名是否在UTF8中?(python判断文件名)

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

经过大量的努力,我发现唯一的解决scheme可以为我工作 – 使用python脚本将文件重命名为UTF8,所以PHP脚本可以在那之后处理它们。

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

我用下面的python脚本,工作正常:

Git拉无效的Windows文件名

在Bash中提取文件名和扩展名

为什么所有名为win32的?

Windows“zip文件夹”文件编码

Windows命令行和batch file:文件名中未转义的特殊字符的潜在问题?

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对我来说是非常新的,对我来说,debugging即使是一个简单的脚本也是一个巨大的努力,所以请写一个明确的答案(即代码)。 我没有testing一般想法的能力,可能工作,也可能不是。 谢谢。

文件名称的例子:

hello.txt你好.txt 안녕하세요.html chào.doc

重命名在Unix上创build的在Windows中有特殊字符的文件的最佳实践?

是否可以在文件名中使用“/”?

冒号在Python中的文件名

如何从任意string中创build一个有效的Windows文件名?

如何检查一个string是否是使用R的窗口的有效文件名?

我认为你混淆了你的术语,并做出了一些错误的假设。 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))

分解:

打印文件名。 默认情况下,Windows shell仅在本地DOS代码页中显示结果。 例如,我的s​​hell可以显示ü.txt但是€.txt显示为?.txt 。 因此,您需要小心Python抛出异常,因为它不能正确打印。 此代码尝试打印Unicode版本,但是尝试打印Unicode代码点转义。

尝试将字符串编码为Windows-1252。 如果这个工作,文件名是好的

否则:将文件名转换为UTF-8,然后百分比编码。 这样,文件名仍然是唯一的,你可以在PHP中反转这个过程。

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

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

对于Python的所有UTF-8问题,我热烈地建议在PyCon 2012上花36分钟观看Ned Batchelder( http://nedbatchelder.com/text/unipain.html )上的“Pragmatic Unicode” 。对我来说这是一个启示! 本演示文稿中的很多内容实际上并不是Python特定的,但有助于理解Unicode字符串和UTF-8编码字节之间的区别。

我向你推荐这个视频的原因(就像我为许多朋友所做的一样),是因为你的代码包含了一些矛盾,比如尝试decode ,然后在解码失败的时候encode :这种方法不适用于同一个对象! 尽管在Python2中它可能是语法上可能的,但是在Python 3中, bytes和str之间的分歧使事情变得更加清晰:

一个str对象可以用bytes 编码

>>> a = ''a'' >>> type(a) <class ''str''> >>> a.encode <built-in method encode of str object at 0x7f1f6b842c00> >>> a.decode Traceback (most recent call last): File "<stdin>",line 1,in <module> AttributeError: ''str'' object has no attribute ''decode''

…而一个bytes对象可以在str 解码

>>> b = b''b'' >>> type(b) <class ''bytes''> >>> b.decode <built-in method decode of bytes object at 0x7f1f6b79ddc8> >>> b.encode Traceback (most recent call last): File "<stdin>",in <module> AttributeError: ''bytes'' object has no attribute ''encode''

回到你使用文件名的问题,你需要回答的棘手的问题是:“什么是你的文件名的编码”。 语言无所谓,只有编码 !

总结

以上是小编为你收集整理的Python如何检查文件名是否在UTF8中?全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

bash – 如何检查文件名是否与shell脚本中的regex匹配

bash – 如何检查文件名是否与shell脚本中的regex匹配

我有一个 shell脚本,需要检查文件名是否与某个正则表达式匹配,但它总是显示“不匹配”.谁能告诉我我的代码有什么问题?

fileNamePattern=abcd_????_def_*.txt
realFilePath=/data/file/abcd_12bd_def_ghijk.txt

if [[ $realFilePath =~ $fileNamePattern ]]
then
    echo $realFilePath match  $fileNamePattern
else
    echo $realFilePath not match $fileNamePattern
fi

解决方法

正则表达式与更简单的“glob”/“wildcard”/“normal”模式之间存在混淆 – 无论你想要什么称呼它们.你正在使用后者,但称之为正则表达式.

如果你想使用一个模式,你应该

>在分配1时引用它:

fileNamePattern="abcd_????_def_*.txt"

你不想要任何东西扩展.
>使其与完整路径匹配.这与以下内容不符:

$mypath="/mydir/myfile1.txt"
$mypattern="myfile?.txt"
$[[ $mypath == $mypattern ]] && echo "Matches!" || echo "Doesn't match!"
Doesn't match!

但在将模式扩展为以*开头之后:

$mypattern="*myfile?.txt"
$[[ $mypath == $mypattern ]] && echo "Matches!" || echo "Doesn't match!"
Matches!

第一个不匹配,因为它只匹配文件名,但不匹配完整路径.或者,您可以使用第一个模式,但使用parameter expansion删除路径的其余部分:

$mypattern="myfile?.txt"
$mypath="/mydir/myfile1.txt"
$echo "${mypath##*/}"
myfile1.txt
$[[ ${mypath##*/} == $mypattern ]]  && echo "Matches!" || echo "Doesn't match!"
Matches!

>使用==而不是=〜,如上例所示.您也可以使用更多portable =,但由于我们已经使用非POSIX [[]]而不是[],我们也可以使用==.

如果你想使用正则表达式,你应该:

>将您的模式写成一个:?和*在正则表达式中有不同的含义;他们修改了他们所追求的东西,而在水珠模式中,他们可以自立(见the manual).相应的模式将变为:

fileNameRegex="abcd_.{4}_def_.*.txt"

并可以像这样使用:

$realFilePath="/data/file/abcd_12bd_def_ghijk.txt"
$[[ $mypath =~ $fileNameRegex ]] && echo "Matches!" || echo "Doesn't match!"
Matches!

>保持将正则表达式写入单独参数的习惯,然后在条件运算符[[]]中不加引号使用它,或者转义变得非常混乱 – 它在Bash版本中也更具可移植性.

BashGuide有一个关于Bash中不同类型模式的great article.

请注意,引用您的参数几乎总是一个好习惯.在[[]]中的条件表达式中不需要它,并且实际上将右侧的解释抑制为模式或正则表达式.如果你使用[](它不支持正则表达式和模式),则需要引用以避免特殊字符和空字符串的意外副作用.

1实际上在这种情况下并不完全正确.分配给变量时,manual表示发生以下情况:

[…] tilde expansion,parameter and variable expansion,command substitution,arithmetic expansion,and quote removal […]

即,没有路径名(glob)扩展.虽然在这种情况下使用

fileNamePattern=abcd_????_def_*.txt

与引用的版本一样有效,使用引号可以防止在许多其他情况下出现意外,并且只要模式中有空白就需要使用引号.

python – 如何检查特定数字是否在整数中

python – 如何检查特定数字是否在整数中

我想检查一下,例如,数字’2’是否在4059304593中.
我的目的是检查是否有任何数字1-9不在我的整数.这是我尝试过的:

for i in xrange(10):
    for j in xrange(100):
        num = str(i^j)
        one_count = 0
        two_count = 0
        for k in xrange(len(num)):
            if num[k] == 1:
                one_count += 1
            if num[k] == 2:
                two_count += 1

然后我的“计数”将一直下降到nine_count,如果任何计数为0,那么该数字不在’num’中.从我在这些网站上看到的内容来看,我的脚本效率低下 – 有人能指出更好的方法吗?

解决方法

这个“数字”的东西需要一个字符串方法,而不是数字方法(让我想起一些 Project Euler个谜题).

我先创建一个数字的数字(同时删除重复数字)

s = set(str(4059304593))

然后检查一个数字:

print('2' in s)

(注意,对于一个集合是高性能的)

然后,检查s是否包含所有013456789数字:

print(s.issuperset("013456789"))

(如果必须多次执行此操作,可能需要使用字符串创建一个集合,issuperset将更快地工作)

python – 检查文件名是否有效

python – 检查文件名是否有效

在所有平台(包括 Android,iOS等移动平台)上检查文件名是否在Python中有效的最保守的方法是什么?

防爆.

this_is_valid_name.jpg – >有效

** adad.jpg – >无效

a / ad – >无效

解决方法

检查文件是否是目标操作系统上的有效文件名的最苛刻的方法是检查正确测试的文件名列表.
valid = myfilename in ['this_is_valid_name.jpg']

在此基础上,您可以定义一组您知道在每个平台上的文件名中允许的字符:

valid = set(valid_char_sequence).issuperset(myfilename)

但这还不够,就像一些操作系统have reserved filenames.

您需要排除保留名称或与OS允许的文件名域匹配的create an expression(regexp),并针对每个目标平台测试您的文件名.

AFAIK,Python不提供这样的帮助器,因为它是Easier to Ask Forgiveness than Permission.操作系统/文件系统有很多不同的可能组合,当os引发异常时,比检查所有它们的安全文件名域更容易做出适当的反应.

python 乱码,python 编码,python 中文编码转换,python utf-8,python utf8,python unicode

python 乱码,python 编码,python 中文编码转换,python utf-8,python utf8,python unicode

python 编码转换
这个 2.6 就是用来向 3k 过渡的,我还是期待 py3k,wxwidget3 也在开发当中,两者的主要改变不约而同的都集中在 unicode 问题上,
现在用 py2.5+wxpy2.8
配合做软件,感觉最不方便的就是编码问题,用 iewin 的 LoadString 输出中文就是搞不定,这个列表中以前也有人问过这问题,可惜没有解决方案。
期待将来的 py3k+wxpy3 能一劳永逸的解决编码问题。
 
我的解决方案,LoadString 支持中文
 汉字转为 html 实体字符得了。
 echo mb_convert_encoding ("重玩一次", "HTML-ENTITIES", "gb2312");
 
编码转换
s = "中文"
s1 = u"中文"
 
unicode -> gbk
 s1.encode("gbk")
unicode -> utf-8
 s1.encode("UTF-8")
gbk ->unicode
 unicode(s, "gbk")
 或者
 s.decode("gbk")
 

我们今天的关于Python如何检查文件名是否在UTF8中?python判断文件名的分享就到这里,谢谢您的阅读,如果想了解更多关于bash – 如何检查文件名是否与shell脚本中的regex匹配、python – 如何检查特定数字是否在整数中、python – 检查文件名是否有效、python 乱码,python 编码,python 中文编码转换,python utf-8,python utf8,python unicode的相关信息,可以在本站进行搜索。

本文标签: