以上就是给各位分享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判断文件名)
- bash – 如何检查文件名是否与shell脚本中的regex匹配
- python – 如何检查特定数字是否在整数中
- python – 检查文件名是否有效
- python 乱码,python 编码,python 中文编码转换,python utf-8,python utf8,python unicode
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代码页中显示结果。 例如,我的shell可以显示ü.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匹配
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
解决方法
如果你想使用一个模式,你应该
>在分配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 – 如何检查特定数字是否在整数中
我的目的是检查是否有任何数字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’中.从我在这些网站上看到的内容来看,我的脚本效率低下 – 有人能指出更好的方法吗?
解决方法
我先创建一个数字的数字(同时删除重复数字)
s = set(str(4059304593))
然后检查一个数字:
print('2' in s)
(注意,对于一个集合是高性能的)
然后,检查s是否包含所有013456789数字:
print(s.issuperset("013456789"))
(如果必须多次执行此操作,可能需要使用字符串创建一个集合,issuperset将更快地工作)
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如何检查文件名是否在UTF8中?和python判断文件名的分享就到这里,谢谢您的阅读,如果想了解更多关于bash – 如何检查文件名是否与shell脚本中的regex匹配、python – 如何检查特定数字是否在整数中、python – 检查文件名是否有效、python 乱码,python 编码,python 中文编码转换,python utf-8,python utf8,python unicode的相关信息,可以在本站进行搜索。
本文标签: