print 方法默认调用 sys.stdout.write 方法,即往控制台打印字符串
在 Python3 中,input()获取用户输入,不论用户输入的是什么,获取到的都是字符串类型的。
在 Python2 中有 raw_input()和 input(), raw_input()和 Python3 中的 input()作用是一样的,input()输入的是什么数据类型的,获取到的就是什么数据类型的。
两者用法相同,不同的是 range 返回的结果是一个列表,而 xrange 的结果是一个生成器,前者是直接开辟一块内存空间来保存列表,后者是边循环边使用,只有使用时才会开辟内存空间,所以当列表很长时,使用 xrange 性能要比 range 好
l1 = []
for i in range(10):
l1.append({"num": i})
print(l1)
l2 = []
a = {"num": 0}
for i in range(10):
a['num'] = i
l2.append(a)
print(l2)
方法一:
可以通过生成器,分多次读取,每次读取数量相对少的数据(比如 500MB)进行处理,处理结束后再读取后面的 500MB 的数据。
方法二:
可以通过 linux 命令 split 切割成小文件,然后再对数据进行处理,此方法效率比较高。可以按照行数切割,可以按照文件大小切割。
现在考虑有一个 jsonline 格式的文件 file.txt 大小约为 10K,之前处理文件的
代码如下所示
def process(): # process the data
pass
def get_lines():
l = []
with open('file.txt', 'rb') as f:
for eachLine in f:
l.append(eachLine)
return l
if __name__ == "__main__":
for e in get_lines():
process(e)
现在要处理一个大小为 10G 的文件,但是内存只有 4G,如果在只修改 get_lines 函数而其他代码保持不变的情况下,应该如何实现?需要考虑的问题都有哪些?
def get_lines():
l = []
with open('file.txt', 'rb') as f:
data = f.readlines(60000)
l.append(data)
yield l
要考虑到的问题有:
内存只有 4G 无法一次性读入 10G 的文件,需要分批读入。分批读入数据要记录每次读入数据的位置。分批每次读入数据的大小,太小就会在读取操作上花费过多时间。
read:读取整个文件。
readline:读取下一行,使用生成器方法。
readlines:读取整个文件到一个迭代器以供我们遍历
def print_directory_contents(sPath):
"""
这个函数接收文件夹的名称作为输入参数
返回该文件夹中文件的路径
以及其包含文件夹中的文件路径
:param sPath:
:return:
"""
import os
for sChildPath in os.listdir(sPath):
sChildPath = os.path.join(sPath, sChildPath)
if os.path.isdir(sChildPath):
print_directory_contents(sChildPath)
else:
print(sChildPath)
except: #捕获所有异常
except: <异常名>: #捕获指定异常
except:<异常名 1, 异常名 2> : 捕获异常 1 或者异常 2
except:<异常名>,<数据>:捕获指定异常及其附加的数据
except:<异常名 1,异常名 2>:<数据>:捕获异常名 1 或者异常名 2,及附加的数据
内置模块:
os 操作系统,time 时间,random 随机,pymysql 连接数据库,threading 线程,multiprocessing进程,queue 队列。
第三方库:
django 和 flask 也是第三方库,requests,virtualenv,selenium,scrapy,xadmin,celery,
re,hashlib,md5。
常用的科学计算库(如 Numpy,Scipy,Pandas)。
assignment:
在 Python 中,对象的赋值就是简单的对象引用,这点和 C++不同,如下所示
a = [1, 2, 'hello', ['python', 'C++']]
b = a
在上述情况下,a 和 b 是一样的,他们指向同一片内存,b 不过是 a 的别名,是引用.
我们可以使用 b is a 去判断,返回 True,表明他们地址相同,内容相同,也可以使用 id()函数来查看两个列表的地址是否相同。
赋值操作(包括对象作为参数、返回值)不会开辟新的内存空间,它只是复制了对象的引用。也就是说除了 b 这个名字之外,没有其他的内存开销。修改了 a,也就影响了 b,同理,修改了 b,也就影响了 a。
shallow copy:
? 浅拷贝会创建新对象,其内容非原对象本身的引用,而是原对象内第一层对象的引用。
浅拷贝有三种形式:切片操作、工厂函数、copy 模块中的 copy 函数。
比如上述的列表 a;
切片操作:b = a[:] 或者 b = [x for x in a];
工厂函数:b = list(a);
copy 函数:b = copy.copy(a);
? 浅拷贝产生的列表 b 不再是列表 a 了,使用 is 判断可以发现他们不是同一个对象,使用 id 查看,他们也不指向同一片内存空间。但是当我们使用 id(x) for x in a 和 id(x) for x in b 来查看 a 和 b 中元素的地址时,可以看到二者包含的元素的地址是相同的。
? 在这种情况下,列表 a 和 b 是不同的对象,修改列表 b 理论上不会影响到列表 a。但是要注意的是,浅拷贝之所以称之为浅拷贝,是它仅仅只拷贝了一层,在列表 a 中有一个嵌套的list,如果我们修改了它,情况就不一样了。
? 比如:a[3].append(‘java‘)。查看列表 b,会发现列表 b 也发生了变化,这是因为,我们修改了嵌套的 list,修改外层元素,会修改它的引用,让它们指向别的位置,修改嵌套列表中的元素,列表的地址并未发生变化,指向的都是用一个位置。
deep copy
? 深拷贝只有一种形式,copy 模块中的 deepcopy()函数。
? 深拷贝和浅拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。因此,它的时间和空间开销要高。
? 同样的对列表 a,如果使用 b = copy.deepcopy(a),再修改列表 b 将不会影响到列表 a,即使嵌套的列表具有更深的层次,也不会产生任何影响,因为深拷贝拷贝出来的对象根本就是一个全新的对象,不再与原来的对象有任何的关联。
拷贝注意点
? 对于非容器类型,如数字、字符,以及其他的“原子”类型,没有拷贝一说,产生的都是原对象的引用。
? 如果元组变量值包含原子类型对象,即使采用了深拷贝,也只能得到浅拷贝。
__init__ # initial 在对象创建后,对对象进行初始化
__new__ # 是在对象创建之前,开辟一个对象空间,并将该对象空间返回给__init__
# os.path 主要是用于对系统路径文件的操作
# sys.path 主要是对 Python 解释器的系统环境参数的操作(动态的改变 Python 解释器搜索路径)
# 在 Python 中,unittest 是 Python 中的单元测试框架。它拥有支持共享搭建、自动测试、在测试
# 中暂停代码、将不同测试迭代成一组,等的功能。
# 在 Python 中,模块是搭建程序的一种方式。每一个 Python 代码文件都是一个模块,并可以引用
# 其他的模块,比如对象和属性。
# 一个包含许多 Python 代码的文件夹是一个包。一个包可以包含模块和子文件夹
# 强类型:不允许不同类型相加
# 动态:不使用显示数据类型声明,且确定一个变量的类型是在第一次给它赋值的时候
# 脚本语言:一般也是解释型语言,运行代码只需要一个解释器,不需要编译。
Python 是强类型的动态脚本语言
# 计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,
# 计算机才能执行高级语言编写的程序
# 解释性语言在运行程序的时候才会进行翻译
# 编译型语言写的程序在执行之前,需要一个专门的编译过程,把程序编译成机器语言(可执行文件)
内建函数封装了各种转换函数,可以使用目标类型关键字强制类型转换,进制之间的转换可以用
int(‘str’,base=’n’)将特定进制的字符串转换为十进制,再用相应的进制转换函数将十进制转换
为目标进制。
可以使用内置函数直接转换的有:
list(tuple_01)
tuple(list_01)
python2 | python3 | 表现 | 转换 | 作用 |
---|---|---|---|---|
str | bytes | 字节 | encode | 存储 |
unicode | str | 字符 | decode | 显示 |
mydict = dict()
mydict = {"a": 1, "b": 2, "c": 3}
mydict.keys() # <built-in method keys of dict object at 0x000000000040B4C8>
list(mydict.keys()) # ['a', 'c', 'b']
python2
raise IOError, "file error" # 抛出异常
except NameError, err: # 捕捉异常
python3
raise IOError("file error") #抛出异常
except NameError as err: #捕捉异常
for 循环中变量值区别
Python2,for 循环会修改外部相同名称变量的值
i = 1
print('comprehension: ', [i for i in range(5)])
print('after:i = ', i) # i = 4
Python3,for 循环不会修改外部相同名称变量的值
i = 1
print("comprehension: ", [i for i in range(5)])
print('after: i = ', i) # i = 1
round 函数返回值区别
Python2,round 函数返回 float 类型值
isinstance(round(15.5),int) #True
Python3,round 函数返回 int 类型值
isinstance(round(15.5),float) #True
比较操作符区别
Python2 中任意两个对象都可以比较
11 < 'test' # True
Python3 中只有同一数据类型的对象可以比较
11 < 'test' # TypeError: unorderable types: int() < str()
我们在pip官方下载源pypi搜索Python2.7和Python3.5的第三方工具包数可以发现,Python2.7
版本对应的第三方工具类目数量是 28523,Python3.5 版本的数量是 12457,这两个版本在第三方工具
包支持数量差距相当大。
我们从数据分析的应用角度列举了常见实用的第三方工具包(如下表),并分析这些工具包在
Python2.7 和 Python3.5 的支持情况:
分类 | 工具名 | 用途 |
---|---|---|
数据收集 | scrapy | 网页采集,爬虫 |
数据收集 | scrapy-redis | 分布式爬虫 |
数据收集 | selenium | web 测试,仿真浏览器 |
数据处理 | beautifulsoup | 网页解释库,提供 lxml 的支持 |
数据处理 | lxml | xml 解释库 |
数据处理 | xlrd | excel 文件读取 |
数据处理 | xlwt | excel 文件写入 |
数据处理 | xlutils | excel 文件简单格式修改 |
数据处理 | pywin32 | excel 文件的读取写入及复杂格式定制 |
数据处理 | Python-docx | Word 文件的读取写入 |
数据分析 | numpy | 基于矩阵的数学计算库 |
数据分析 | pandas | 基于表格的统计分析库 |
数据分析 | scipy | 科学计算库,支持高阶抽象和复杂模型 |
数据分析 | statsmodels | 统计建模和计量经济学工具包 |
数据分析 | scikit-learn | 机器学习工具库 |
数据分析 | gensim | 自然语言处理工具库 |
数据分析 | jieba | 中文分词工具库 |
数据存储 | MySQL-python | mysql 的读写接口库 |
数据存储 | mysqlclient | mysql 的读写接口库 |
数据存储 | SQLAlchemy | 数据库的 ORM 封装 |
数据存储 | pymsql | sql server 读写接口库 |
数据存储 | redis | redis 的读写接口 |
数据存储 | PyMongo | mongodb 的读写接口 |
数据呈现 | matplotlib | 流行的数据可视化库 |
数据呈现 | seaborn | 美观的数据可是湖库,基于 matplotlib |
工具辅助 | chardet | 字符检查工具 |
工具辅助 | ConfigParser | 配置文件读写支持 |
工具辅助 | requests | HTTP 库,用于网络访问 |
windows 环境
Python2 无法安装 mysqlclient。Python3 无法安装 MySQL-python、 flup、functools32、Gooey、Pywin32 、webencodings。
matplotlib 在 python3 环境中安装报错:The following required packages can not be built:freetype, png。需要手动下载安装源码包安装解决。
scipy 在 Python3 环境中安装报错,numpy.distutils.system_info.NotFoundError,需要自己手工下载对应的安装包,依赖 numpy,pandas 必须严格根据 python 版本、操作系统、64 位与否。运行matplotlib 后发现基础包 numpy+mkl 安装失败,需要自己下载,国内暂无下载源
centos 环境下
Python2 无法安装mysql-python和 mysqlclient包,报错:EnvironmentError: mysql_config not found,解决方案是安装 mysql-devel 包解决。使用 matplotlib 报错:no module named _tkinter,安装 Tkinter、tk-devel、tc-devel 解决。
pywin32 也无法在 centos 环境下安装
Python 自省是 Python 具有的一种能力,使程序员面向对象的语言所写的程序在运行时,能够获得对象的类Python 型。Python 是一种解释型语言,为程序员提供了极大的灵活性和控制力
PEP8 规范。
# 常量:大写加下划线
USER_CONSTANT = "a constant"
# 私有变量 : 小写和一个前导下划线
"""
Python 中不存在私有变量一说,若是遇到需要保护的变量,使用小写和一个前导下划线。但这只是
程序员之间的一个约定,用于警告说明这是一个私有变量,外部类不要去访问它。但实际上,外部类还
是可以访问到这个变量。
"""
_private_value = "my private value"
# 内置变量 : 小写,两个前导下划线和两个后置下划线
"""
两个前导下划线会导致变量在解释期间被更名。这是为了避免内置变量和其他变量产生冲突。用户
定义的变量要严格避免这种风格。以免导致混乱
"""
__class__ = "inner value"
函数和方法
总体而言应该使用,小写和下划线。但有些比较老的库使用的是混合大小写,即首单词小写,之后每个单词第一个字母大写,其余小写。但现在,小写和下划线已成为规范
私有方法 :小写和一个前导下划线
这里和私有变量一样,并不是真正的私有访问权限。同时也应该注意一般函数不要使用两个前导下划线(当遇到两个前导下划线时,Python 的名称改编特性将发挥作用)。
特殊方法 :小写和两个前导下划线,两个后置下划线
这种风格只应用于特殊函数,比如操作符重载等。
函数参数 : 小写和下划线,缺省值等号两边无空格
类
类总是使用驼峰格式命名,即所有单词首字母大写其余字母小写。类名应该简明,精确,并足以从
中理解类所完成的工作。常见的一个方法是使用表示其类型或者特性的后缀,例如:
SQLEngine,MimeTypes 对于基类而言,可以使用一个 Base 或者 Abstract 前缀 BaseCookie,
AbstractGroup
模块和包
除特殊模块 init 之外,模块名称都使用不带下划线的小写字母。
若是它们实现一个协议,那么通常使用 lib 为后缀,例如:
import smtplib
import os
import sys
关于参数
其它
# 使用 has 或 is 前缀命名布尔元素
is_connect = True
has_member = False
# 用复数形式命名序列
members = ['user_1', 'user_2']
# 用显式名称命名字典
person_address = {'user_1': '10 road WD', 'user_2': '20 street huafu'}
# 避免通用名称
诸如 list, dict, sequence 或者 element 这样的名称应该避免
# 避免现有名称
诸如 os, sys 这种系统已经存在的名称应该避免
一些数字
一行列数 : PEP 8 规定为 79 列。根据自己的情况,比如不要超过满屏时编辑器的显示数。
一个函数 : 不要超过 30 行代码, 即可显示在一个屏幕类,可以不使用垂直游标即可看到整函数。
一个类 : 不要超过 200 行代码,不要有超过 10 个方法。一个模块 不要超过 500 行。
验证脚本
可以安装一个 pep8 脚本用于验证你的代码风格是否符合 PEP8
# 在显示名称的时候会在文件夹后添加“/”,在文件后面加“*”
ls -F
日志以文本可以存储在“/var/log/”目录下后缀名为.log
netstat -anp | grep service_name
直接修改/etc/rc0.d ~ /etc/rc6.d 和/etc/rcS.d 文件夹的内容,添加需启动的程序,S 开头的表示启动,K 开头的表示不启动
Linux 系统中 grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep 全称是 Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
linux 下的 find:
功能:在目录结构中搜索文件,并执行指定的操作。此命令提供了相当多的查找条件,功能很强大。
语法:find 起始目录寻找条件操作
说明:find 命令从指定的起始目录开始,递归地搜索其各个子目录,查找满足寻找条件的文件并对之采取相关的操作。
简单点说说,grep 是查找匹配条件的行,find 是搜索匹配条件的文件
1、重定向>
Linux 允许将命令执行结果重定向到一个文件,本应显示在终端上的内容保存到指定文件中。如:ls >test.txt ( test.txt 如果不存在,则创建,存在则覆盖其内容 )。
2、重定向>>
? 这个是将输出内容追加到目标文件中。如果文件不存在,就创建文件;如果文件存在,则将新的内容追加到那个文件的末尾,该文件中的原有内容不受影响。
软连接类似 Windows 的快捷方式,当删除源文件时,那么软链接也失效了。
硬链接可以理解为源文件的一个别名,多个别名所代表的是同一个文件。当 rm 一个文件的时候,那么此文件的硬链接数减1,当硬链接数为 0 的时候,文件被删除。
pwd 显示工作路径
ls 查看目录中的文件
cd /home 进入 '/ home' 目录'
cd .. 返回上一级目录
cd ../.. 返回上两级目录
mkdir dir1 创建一个叫做 'dir1' 的目录'
rm -f file1 删除一个叫做 'file1' 的文件',-f 参数,忽略不存在的文件,从不给出提示。
rmdir dir1 删除一个叫做 'dir1' 的目录'
groupadd group_name 创建一个新用户组
groupdel group_name 删除一个用户组
tar -cvf archive.tar file1 创建一个非压缩的 tarball
tar -cvf archive.tar file1 file2 dir1 创建一个包含了 'file1', 'file2' 以及 'dir1'的档案文件
tar -tf archive.tar 显示一个包中的内容
tar -xvf archive.tar 释放一个包
tar -xvf archive.tar -C /tmp 将压缩包释放到 /tmp 目录下
tar -cvfj archive.tar.bz2 dir1 创建一个 bzip2 格式的压缩包
tar -xvfj archive.tar.bz2 解压一个 bzip2 格式的压缩包
tar -cvfz archive.tar.gz dir1 创建一个 gzip 格式的压缩包
tar -xvfz archive.tar.gz 解压一个 gzip 格式的压缩包
reboot 重新启动操作系统
shutdown –r now 重新启动操作系统,shutdown 会给别的用户提示
shutdown -h now 立刻关机,其中 now 相当于时间为 0 的状态
shutdown -h 20:25 系统在今天的 20:25 会关机
shutdown -h +10 系统再过十分钟后自动关机
init 0 关机
init 6 重启
1.git merge 冲突了,根据提示找到冲突的文件,解决冲突如果文件有冲突,那么会有类似标记
2.修改完之后,执行 git add 冲突文件名
3.git commit 注意:没有-m 选项 进去类似于 vim 的操作界面,把 conflict 相关的行删除掉直接 push 就可以了,因为刚刚已经执行过相关 merge 操作了
原文:https://www.cnblogs.com/pankypan/p/11066839.html