Python 小问题收集

实现功能集

压缩文件夹及重命名

需求是,压缩一个文件夹后对压缩包文件重命名,且不改变压缩包里的文件夹命名;在压缩过程过滤掉markdown类型的文件

import zipfile

    file_absolute_path_list = []
    for root, dirs, files in os.walk(source_path):
        file_list.append(root)
        for file_name in files:
            file_absolute_path_list.append(os.path.join(root,file_name))
            
    zip_object= zipfile.ZipFile(target_path, "w", compression=zipfile.ZIP_DEFLATED)
    
    start_location = len(source_path) - len(source_path.split('/')[-1])
    for file_absolute_path in file_absolute_path_list:
        file_relative_path = file_absolute_path[start_location:]
        if file_absolute_path.split('.')[-1] != 'md':
            zip_object.write(file_absolute_path, file_relative_path)
            
    zip_object.close()
    
    os.rename(target_path, new_target_path)

假设这里的 source_path 为 ‘/Resources/Directory’,那么在历遍 file_absolute_path_list 时,file_relative_path 的值就会是 /Directory/xx_file 或者 /Directory/xx_sub_directory/yy_file。

然后通过 zipfile 对象的 .write 方法的第二个参数指定文件在压缩包中的相对路径(第一个参数是要压缩的文件本地绝对路径)。

若相对路径中不指定 /Directory 的这一层路径,zipfile 会在解压时自动将文件统一解压到压缩包同名的文件夹中,压缩包更名时该文件夹也会随之更名。(当你双击压缩包查看里面的内容时会发现各个文件是从根目录里开始存放,而非使用着压缩包同名的文件夹装载)

若指定相对路径中的 /Directory 这层路径,则 zipfile 会在解压时将文件统一解压到 /Directory 中,并且即使在压缩包更名,该解压出来的文件夹依然叫 Directory 。(当你双击压缩包查看里面的内容时会发现各个文件使用着 Directory 这个文件夹来装载)

使用Multipart/form-data上传文件

https://www.jianshu.com/p/e810d1799384
http://hbprotoss.github.io/posts/multipartform-datade-shi-xian.html

压缩及解压文件

https://www.jianshu.com/p/0c7b3365eec0

命令行

#只返回结果
import os
os.system("command")

#返回结果与终端显示信息
output = os.popen("command",mode) #mode='r'
output.read()
out = output.readlines()
for i in out:
    print(i.strip())
    
#只返回结果
import subprocess
print subprocess.call("command", shell=True)
```    

### 捕获异常

try:
i = int(‘a’)
except Exception, e:
print ‘str(Exception):\t’, str(Exception)
print ‘str(e):\t\t’, str(e)
print ‘repr(e):\t’, repr(e)
print ‘e.message:\t’, e.message
print ‘traceback.print_exc():’; traceback.print_exc()
print ‘traceback.format_exc():\n%s’ % traceback.format_exc()


输出

>str(Exception):<type 'exceptions.Exception'>
>str(e): invalid literal for int() with base 10: 'a'
>repr(e): ValueError("invalid literal for int() with base 10: 'a'",)
>e.message: invalid literal for int() with base 10: 'a'
>traceback.print_exc():
>Traceback (most recent call last):
> File "get_exception_info.py", line 22, in <module>
> i = int('a')
> ValueError: invalid literal for int() with base 10: 'a'
>traceback.format_exc():
>Traceback (most recent call last):
> File "get_exception_info.py", line 22, in <module>
> i = int('a')
> ValueError: invalid literal for int() with base 10: 'a'


### 更新字典中存在的key的value,而不添加额外的key-value

>>> dict1 = {'foo':'bar', 'ham': 'eggs'}
>>> dict2 = {'ham': 'spam', 'bar': 'baz'}
>>> dict1.update((k, dict2[k]) for k in set(dict2).intersection(dict1))
>>> dict1
{'foo': 'bar', 'ham': 'spam'}

### 获取文件的 md5 hash 值

import hashlib
hash_md5 = hashlib.md5()

对于过大的文件,需要分段读取,此处取 4096,避免内存溢出问题

with open(image_file_path, ‘rb’) as f:
for chunk in iter(lambda: f.read(4096), b””):
hash_md5.update(chunk)
result = hash_md5.hexdigest()


### 判断对象类型

if isinstance(a,int):
print “a is int”
else:
print “a is not int”
if isinstance(b,list):
print “b is list”
else:
print “b is not list”
if isinstance(c,tuple):
print “c is tuple”
else:
print “c is not tuple”
if isinstance(d,dict):
print “d is dict”
else:
print “d is not dict”
if isinstance(e,str):
print “d is str”
else:
print “d is not str”


### json字符串与对象互转


## 问题集

### 安装 python3.7 或 pbxproj 等第三方库时,提示 ModuleNotFoundError: No module named '_ctypes'
另一个表现是,使用 sudo apt-get install 安装其它库时提示python3-lib2to3等库缺失。

解决方法:

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
$ sudo apt-get install build-essential python-dev python-setuptools python-pip python-smbus
$ sudo apt-get install build-essential libncursesw5-dev libgdbm-dev libc6-dev
$ sudo apt-get install zlib1g-dev libsqlite3-dev tk-dev
$ sudo apt-get install libssl-dev openssl
$ sudo apt-get install libffi-dev


然后,必须注意的一步,就是再重新编译安装python3.7

$ wget https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tgz
$ tar zxvf Python-3.7.5.tgz
$ cd /tmp/Python-3.7.5
$ ./configure –with-ssl
$ make
$ sudo make install


注意–with-ssl必须加上,否则使用pip安装第三方包时,会引发ssl错误。

最后创建软连接

whereis python3.7
sudo rm -rf /usr/bin/python3
sudo rm -rf /usr/bin/pip3
$ sudo ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3
$ sudo ln -s /usr/local/python3/bin/pip3.7 /usr/bin/pip3



### 无法安装任何带 C 扩展的 Python 库,编译的过程提示 <stdio.h> not found
* xcode-select --install
* sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include /usr/include

提示ln: /usr/include: Operation not permitted的话

* 重启电脑
* 在启动过程中按住 cmd + r,进入 Recover Mode
* 选择 utilities > terminal,输入命令
    * csrutil disable   
    * reboot

使用clang或系统的GCC(export CC=gcc)编译失败的话

* brew install gcc49
* export CC=/usr/local/Cellar/gcc49/4.9.3/bin/gcc-4.9

[参考](https://laike9m.com/blog/jie-jue-mac-wu-fa-bian-yi-dai-c-kuo-zhan-ku-de-wen-ti,87/)








转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 mingfungliu@gmail.com

文章标题:Python 小问题收集

文章字数:1.3k

本文作者:Mingfung

发布时间:2018-08-16, 00:00:00

最后更新:2021-01-26, 11:40:34

原始链接:http://blog.ifungfay.com/后端/Python知识小集/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏

宝贝回家