python处理CSV文件
CSV文件CSV即逗号分隔值 Comma-Separated Values
它是一个被行分隔符、列分隔符划分成行和列的文本文件
CSV不指定字符编码
每一行称为一条记录record
表头可选,和字段列对齐就行了
分隔符
行分隔符为\r\n,最后一行可以没有换行符
列分隔符常为逗号或者制表符
字段
字段可以使用双引号括起来,也可以不适用
如果字段中出现了双引号、逗号、换行符必须使用双引号括起来
如果字段的值是双引号,使用两个双引号表示一个转义
csv模块csv.reader(csvfile ,dialect=’execl’, **fmtparams) 返回一个reader对象,是一个行迭代器。
默认使用execl方言,如下:
delimiter列分隔符,逗号
lineterminator行分隔符\r\n
quotechar字段的引用符号,缺省为” 双引号
双引号的处理
doublequote 双引号的处理,默认为True。如果碰到数据中有双引号,而quotechar也是双引号,True则使用2个双引号表示,False表示使用转义字符将作为双引号的前缀
escape ...
GIL全局解释器锁
GIL全局解释器锁CPython 在解释器进程级别有一把锁,叫做GIL,即全局解释器锁。
GIL保证在CPython进程中,只有一个线程执行字节码。甚至在多核CPU的情况下,也只允许同时只能有一个CPU核心上运行该进程的一个线程(就是一个进程中同时只能有一个线程被运行)
Cpython中
IO密集型,某个线程阻塞,GIL会释放,就会调度其他就绪线程。
CPU密集型,当前线程可能会连续的获得GIL,导致其他线程几乎无法使用CPU
在CPython中由于有GIL存在,IO秘籍型,使用多线程较为合算;cpu秘籍型使用多进程,要绕开GIL
Python中绝大多数内置数据结构的读、写操作都是原子操作(在线程运行进行读或写操作时不会被其他线程打断)。
由于GIL的存在,python的内置数据类型在多线程编程的时候就变成了安全的了,但是实际上他们本身不是线程安全类型
测试下面2个程序,请问下面的程序是计算密集型还是IO密集型?(计算密集型)
import logging
import datetime
logging.basicConfig(level=logging.INFO, for ...
IO模型及多路复用
IO模型及多路复用BIO:每个和客户端连接,用的同步阻塞IO fd+多线程,缺点:线程多了
问的最多的,阻塞IO和IO多路复用
Non-blocking IO:循环,效率底下
IO多路复用:OS帮你盯着
阻塞:2个阶段全程阻塞
IO多路复用:第一阶段交给操作系统由他处理,第二阶段调函数阻塞一会,数据从内核空间到用户空间,然后返回结果
fd:文件描述符从0开始,0:标准输入,1:标准输出,2:标准错误输出
select(fds, 1024个位 read, 1024写 标志位)
100个,其中1路IO好了,然后遍历所有fds
for fd in fds:
判断fd是否好了
bitmap 位图
poll
使用数组 fds,每一个fd结构题,包含fd、读、写
for fd in fds:
判断fd对应的结构体里面的读写标志是否ok
epoll
import datetime
import selectors
import socket
import logging
import threading
logging.basicConfig(level=logging.INF ...
JS条件语句和循环语句
JS 条件语句和循环语句语句块JS使用大括号构成语句块。
ES6 之前语句块是没有作用域的,从ES6开始支持 块作用域 ,let只能在块作用域内可见
function hello() {
let a = 1;
var b = 2;
c = 3 }
//let d = 100
if (1) {
let d = 4; // 去掉let会怎么样? 就会变成全局变量
var e = 5;
f = 6
if (true) {
console.log(d)
console.log(e)
console.log(f)
console.log('-------------') g = 10
var h = 11
}
}
//console.log(a) // 不可见
//console.log(b) // 不可见
//console.log(c) // 不可见吗?
//console.log(d) // 块作用域使用let,不可见;但是块外的d可见
console.log(e) ...
JS函数及作用域和异常处理
JS函数及作用域和异常处理1、that
函数function 函数名(参数列表) {
函数体;
return 返回值;
}
function add(x,y){
return x+y;
}
console.log(add(3,5));
函数表达式使用表达式来定义函数,表达式中的函数名可以省略,如果这个函数名不省略,也只能用在此函数内部
// 匿名函数
const add = function(x, y){
return x + y;
};
console.log(add(4, 6));
// 有名字的函数表达式
const sub = function fn(x, y){
return x - y;
};
console.log(sub(5, 3));
//console.log(fn(3, 2)); // fn只能用在函数内部
// 有名字的函数表达式
const sum = function _sum(n) {
if (n===1) retur ...
JS promise和async
JS promise 和async概念ES6开始支持
Pormise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。
简单说,就是处理异步请求的。
如果成功怎么处理,如果失败怎么处理
//语法
new Promise(
//下面的函数是executor
function(resolve,reject){
resolve('成功')
reject('失败')
}
)
executor
executor 是一个带有resolve和reject两个参数的****函数。
executor函数在Promise构造函数执行时立即执行,被传入resolve和reject函数作为参数(executor函数在Promise构造函数返回新建对象前被调用)
executor内部通常会执行一些异步操作,一旦完成,可以调用resolve函数来将promise状态改成fulfilled即完成,或者在发生错误时将它的状态改为rejected即失败。
如果在executor函数中抛出一个错误,那么该promise状态为reje ...
JS对象模型
JS对象模型JavaScript是一种基于原型(prototype)的面向对象语言,而不是基于类的面向对象语言。他基于原型、原型链来实现面向对象。
C++、Java有类Class和实例Instance的概念,类是一类事物的抽象,而实例则是类的实体。
定义类字面式声明方式var obj = { property_1: value_1, // property_# 可以是一个标识符...
2: value_2, // 或一个数字...
["property" +3]: value_3, // 或一个可计算的key名...
// ...,
"property n": value_n }; // 或一个字符串
let a = 1;
let b = 'xyz';
let c = [1,2,3];
let d = x => x + 1;
var obj = {
'a':a, // 引号不省略明确使用该字符串为属性名
b:b, // 引号可以省,但依然转换为字符串作为属性名
[b]:100, // 计算b的值然后在转换为字符串作 ...
JS模块化
JS模块化ES6之前,JS没有出现模块化系统。因为它在设计之初根本没有想到今天的JS应用场景。
JS主要在前端的浏览器中使用,js文件下载缓存到客户端,在浏览器中执行。
比如简单的表单本地验证,漂浮一个广告。
服务器端使用ASP、JSP等动态网页技术,将动态生成数据嵌入一个HTML模板,里面夹杂着JS后使用标签,返回浏览器端执行。 还可以使用src属性,发起一个GET请求返回一个js文 件,嵌入到当前页面执行环境中执行。 这时候的JS只是一些简单函数和语句的组合
2005年之后,随着Google大量使用了AJAX技术之后,可以异步请求服务器端数据,带来了前端交互的巨大变化。前端功能需求越来越多,代码也越来也多。随着js文件的增多,灾难性的后果产生了:
众多js文件通过 引入到当前页面中,每一个js文件发起一个GET请求,众多的js文件都需要返回到浏览器端。网络开销成本颇高
习惯了随便写,js脚本中各种全局变量污染,函数名冲突
JS脚本加载有顺序,JS文件中的代码之间的依赖关系(依赖前后顺序、相互依赖)。
亟待模块化的出现。
2008年V8引擎发布,2009年诞生了Nodejs, ...
JS解构及数组对象操作
JS解构及数组对象操作解构JS的解构很灵活,参考
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator
列表解构var parts = ['shoulder','knees']
var lyrics = ['head', ...parts, 'and', 'toes']; // 使用...解构
console.log(lyrics) // [ 'head', 'shoulder', 'knees', 'and', 'toes' ]
参数解构function f(x, y, z) {
console.log(x + y + z) }
var args = [2, 3 ,4];
f(...args);
f(...['a','b','c']);
数组解构const arr = [100,200,300];
let [x,y,z] = arr;
console.log(0,x,y,z);
// 丢弃
const [,a,] = arr;
...
Logging模块
Logging模块类
类
父类
Logger
日志记录器
RootLogger
Logger
根日志记录器
Handler
处理器,日志的实际处理者。有众多处理器子类
Formatter
格式化器,日志输出格式控制
Filter
过滤器,在Logger实例或Handler实例上过滤日志记录
日志记录器Logger日志记录器都是Logger类的实例,可以通过它实例化得到。但是logging模块也提供了工厂方法。
Logger实例的构建,使用Logger类也行,但推荐getLogger函数。
Logger.manager = Manager(Logger.root) #约1902行,为Logger类注入一个manager类属性
def getLogger(name=None):
"""
Return a logger with the specified name, creating it if necessary.
If no name is specified, return the root logger.
" ...