python的数组、元组、字典、字符串和文件操作

数组使用[]也就是中括号定义   stus = ['xiaohei','xiaobai','xiaohuang','cxdser']

数组的排序是从0开始,也就是取第一个的值是stus[0],排序的编号也称为下标、角标和 索引

最后一个元素的下标为-1,同理倒数第二个元素的下标为-2…

也就是说从前往后数时是从0开始变大,从后往前数是从-1开始变小

stus.append('kk')也就是说.append()方法一次只能加一个值且加到数组的最后一个值

stus.insert(0,'kk').insert()方法会在指定位置添加元素,如0是在最开始

如果指定的下标不存在,如总共有2个元素,结果填9,则会加到最末尾,但如果填写-9,则会在最开始添加

stus[0]='kk'则把第0个值改为kk,想改第几个值输入第几个值的下标

stus.count(元素)方法的意思是查看某个元素在这个数组里面的个数,如果不存在查找的元素则返回0

stus.index(元素)方法的意思是找到括号内元素的下标,若有多个则返回第一个,若没有此元素则会报错

stus.pop(数字)默认删除最后一个元素,若指定下标的话则删除指定的元素,若添加的下标不存在则会报错

删除后会有返回值,print(stus.pop())后会有刚刚删除的值

stus.remove(元素)删除此元素,若有多个则只能删除第一个,此方法不会有返回值

del stus[0]直接删除stus[]中的第0个元素

stus.clear()会清空整个list

stus.reverse()会把数组的顺序 进行反转

stus.sort()进行排序,默认是根据字母进行排序,,默认排序为升序

若数组内的元素属性不同,如int和str的混合,或里面是多维数组,则都无法取值

若输入stus.sort(reverse=True)则是按降序进行排列

多维数组

也就是数组嵌套数组,如all_nums = [123,456,[111,222]],则若要找到111,则找到的方法是print(stus[2][0])

a=[1,2,3]

b=[4,5,6]

a.extend(b)

extend的意思是把两个数组合并到一起生成新的a,同时不改变b的数据

for i in a:

    print(i)

如果直接for循环一个list的时候,那每次循环的值都是 这个list里的元素

切片顾头不顾尾,a[0:2],取得值为0和1,没有2;

a[:2]若切片的第一个数字不写,则是从头开始取

a[1:]若切片第二个数字不写,则是从第1个元素取到末尾

若切片时两个数都不写,则相当于复制了这个数组,全取过来

切片时后面也可加上步长,a[:2:2],意思是每几个取一个,若步长为正数则从左往右取,若步长为负数则从右往左取的,需要注意,若取负数的步长则要注意取的下标,是从数组末尾的-1开始,若此时从0开始取,则取不到值了,因为0已经是数组头,无法再往前取

切片同样适用于字符串,字符串也有下标

title='今天好开心'

print (title[:4])

enumerate 需要两个值代表index和元素  格式为

For I,t in enumerate(title):

    print('%s,%s'%(title))

或者print(I,t)

if判断时遵循非空即真,非0即真

字典,以:分开,前面是key,后面是value,优点是取值方便,且速度快,格式为print(d['name'])若写了不存在的key会报错    或print(d.get('name'))若写了不存在的key会返回none,若想编辑返回的数据则可写成print(d.get('name','找不到')),这是name找不到的情况会返回找不到,若能找到的话则会返回相应的value

字典是无序的

增加

d['shengao']=198         若key存在则进行修改,若不存在则新增

d.setdefault('weight',130)       只能新增,无法进行修改

删除

d.pop('shengao')其中必须包含要被删除的key值

d.popitem()不用传值,会随机删除一个值

del d['shengao']

d.clear() 清空字典

print(d.keys()) 获取字典里所有的key

print(d.values()) 获取字典里所有的value

若要判断addr是否在字典里,则直接if 'addr' in d:

若要判断是否在key里,则if 'addr' in d.keys():

若要判断是否在value里,则if 'addr' in d.values():

for k in d:        这种方法只能print字典里的keys

for k,v in d.items():         这种方法可以把key和value都打印出来,d.items()是把字典的k和v转成一个像二维数组的输出

For k in d:

    print(k,d[k])   或    print(k,d.get(k))

d=[{

  'name':'jiayi',

  'kk':'kk'

  },

  {

  'name':'jiayi1',

  'kk':'kk1',

  'jinku':{

  'a':'aa',

  'b':'bb'

    }

  },

  {

  'name':'jiayi2',

  'kk':'kk2'

  }

]

print(d[1]['jinku']['a'])

stus['tlx']['money']

Stus['mpp']['bag'].keys()

stus={

  'ybq':{

    'age':18,

    'sex':'',

    'addr':'昌平区',

    'money':10000000,

    'jinku':{

      '建行卡':80000,

      '工商卡':800000,

      '招商卡':8000000

      }

    },

  'tlx':{

    'age':19,

    'sex':'',

    'addr':'昌平区',

    'money':10000000,

    'huazhuangpin':['chanle','haha']

    },

  'mpp':{

    'age':19,

    'sex':'',

    'addr':'昌平区',

    'money':10000000,

    "bag":{

      'lv':'一车',

      '鳄鱼':10

      }

    },

}

print('金额为%d'%(sum(stus['ybq']['jinku'].values())))

找到chenle的过滤条件如下

stus['tlx']['huazhuangpin'][0]

在字典里找东西主要看层级和具体的值,要是查key就.keys(),值就.values(),若后面是数组 ,则要根据数组的规则[0]

元组也是list,只不过是不可变的

Print(kk.count('my'))找个数

Print(kk.index('my'))返回下标

字符串的值也不能被修改,只能重新赋值

li = [1,1,2,3,4,5,6,7,8,9]

for i in li:

    if i%2!=0:

        li.remove(i)

print(li)

结果为[1, 2, 4, 6, 8]

循环的时候不能删东西,一删下标就变了

解决方法为加一条li2 = li[:]

复制后下标就不会变

li = [1,1,2,3,4,5,6,7,8,9]

li2=li[:]

for i in li2:

    if i%2!=0:

        li.remove(i)

print(li)

必须使用复制的方法,而不是li2 = li

是因为若直接让li2 = li,则是把li的内存地址给li2,他俩指向的是一个,则在后面循环的时候还是会改变这个数组的值

li2 = li  浅拷贝

li2 = li[:]  深拷贝

字符串方法

字符串方法都不会改变原来字符串的值

.strip()是默认值,会去掉首尾的空格和换行符

若使用.strip('kk')则会去掉kk

如username = input('kk').strip   是将已经去掉空格的str赋给username

.lstrip()是去掉左边的空格和换行符

.rstrip()是去掉右边的空格和换行符

.count('t') 查找某个字符在字符串里面出现的次数

.capitalize()  将首字母大写

.center(50,'-')将字符串放中间,两边用-补齐为50

Index = name.find('t')找到这个字符串,返回它的下标,若有多个值返回第一个的下标,若不存在,返回-1

Index = name.index('d')找到这个字符串,返回它的下标,若不存在就报错

Print(name.upper())把所有字母都变成大写

Print(name.lower())把所有字母都变成小写

File_name = 'a.xls'

Print(file_name.endswith('.xls'))   判断一个字符串是不是以xxx结尾

Print(file_name.startswith('a'))    判断一个字符串是不是以xxx开头

.format()字符串格式化

f.format_map() 传进的是一个字典

.replace('select','update'),第一个old,第二个new

.isdigit()是否是数字

.isalnum()是否包含数字或字母

.isalpha()是否是英文字母

字符串分割   默认不填值的话是按照空格分割

St.split(',')

St = 'a,b,c'   变成list = ['a','b','c']

St_list = st.split(',')

把list = ['a','b','c']   恢复成 str = 'a,b,c'

Res = ','.join(list)

字符串和字典等都可循环,数组内是int、布尔不可循环的不可转换

只要能循环就都可以用.join方法连接

文件读写

http://www.nnzhp.cn/archives/160

F = open('笔记',encoding = 'utf-8')

Print(f.read())   (是一个字符串)

f.write('kk')

f.close

注意,若在windows下新建文件默认的gbk模式,需转换成python默认的utf-8

文件打开有3种方式,读r、写w、追加a,若打开文件是时候没有指定模式,则默认为读,注意:w模式会清空文件原有内容

F = open('笔记','w',encoding = 'utf-8')

Print(f.read())

f.write('kk')

f.close

若想同时具有读和写权限则需写的模式是r+,为读写模式,但只要模式里有r,若文件不存在,执行时都会报错

w+是写读模式,但只要模式里有w,就会把原文件内容清空

a是追加模式,但只能创建和在文件末尾追加,不能读,需变成a+添加读权限

a+的文件指针默认在文件末尾,则无法读出东西

需要使用f.seek(0)将文件指针放到最前头,无法使用seek(-1)移到文件末尾

seek移动指针的时候只对读好使,对写不好使

.readline是只读一行,是一个字符串

.readlines是读取文件的所有内容,把文件里面每一行的内容放到一个list里,包括换行符等

.write只能写入字符串,但.writelines可写入数组、字符串、元组等可迭代能循环的对象,但.write的效率高

.truncate()清空文件内容

.tell()查看当前文件指针的位置

高效处理文件的方法:

fw = open('kk.txt',encoding=utf-8)

Count = 1

For f in fw:

    print('第%s行'%count,f)

    count+=1

直接循环文件对象的话,就是循环文件里面的每一行

fw = open('kk.txt',encoding=utf-8)

Count = 1

For f in fw:

    f = f.strip()

    stu_list = f.split(',')

    count+=1

若发现往文件里写的数据没写进去,可能是因为写进文件的时候先放到缓冲区里,可能现在缓冲区满了,导致写不进去,可调用

f.flush()立即把缓冲区里的文件写到磁盘里

With open('a.txt','w') as kk:

使用with方法可自动管理文件

使用eval把字符串变成字典

f = open('a.txt','w',encoding='utf-8')
names = ['a','b','c']
s='dingfei,123456'
f.write(s)
f.writelines(s)
for name in names:
f.write(name)
for name in names:
f.writelines(names)
import time
f = open('hahah','w')
f.write('sdfsfsd')
f.flush() #立即把缓冲区里面的内容写到磁盘里面

import requests
url = 'http://www.nnzhp.cn/wp-content/uploads/2018/01/601a335c499837a995ae10867fc36101.png'
img = requests.get(url).content

若需进行二进制操作则需在动后加b
rb
wb
ab

f = open('hhh.jpg','wb')# bytes ,以二进制模式打开
f.write(img)

修改文件时共有两种方式

1、将原文件导出,使用一个变量保存,在这个变量中修改,然后清空原文件,将变量重新写到原文件中

with open('geci','a+',encoding='utf-8') as f:
   f.seek(0)
all = f.read()
new_all = all.replace('二','一')
f.seek(0)
f.truncate()
f.write(new_all)
f.flush()

2、新建一个文件,将修改后的内容写入新文件,然后删除原文件,将新文件重命名变回原文件
import os
with open('原文件',encoding='utf-8') as f,open('geci.gy','w',encoding='utf-8') as f2:
for line in f:
new_line = line.replace('一','二')
f2.write(new_line)


os.remove('geci')#删文件
os.rename('geci.gy','geci')#改名

 下面写一个监控脚本:

#1、如果同一个ip地址60s之内访问超过200次,那么就把ip加入黑名单
#需求分析:
#1、60秒读一次文件
#2、分割,取到第一个元素,ip地址
#3、把所有的ip加入到一个list里,如果ip次数超过200次,加入黑名单

import time
point = 0 #文件指针
while True:
ips = []#存放所有的ip地址
blk_set = set() #存放需要加入黑名单ip
with open('access.log',encoding='utf-8') as f:
f.seek(point)
for line in f:
ip = line.split()[0]
ips.append(ip)
#10.125.1.1
if ips.count(ip)>200:
blk_set.add(ip)
for ip in blk_set: #这里是因为防止ip重复加入黑名单,因为集合是去重的,所以里面没有重复的ip
#os.system('jiaurru %s'%ip)
print('加入黑名单%s'%ip)
point = f.tell()
time.sleep(30)



原文地址:https://www.cnblogs.com/kikyoude/p/8215443.html