每日一题-TCP连接在整个生存期内有哪些状态

空心菜 回复了问题 2 人关注 1 个回复 680 次浏览 2020-11-17 11:16 来自相关话题

每日一题-Redis 为什么那么快?

空心菜 回复了问题 3 人关注 2 个回复 742 次浏览 2020-11-05 10:34 来自相关话题

Pyhton列表去重方法总结

Ansible 发表了文章 0 个评论 538 次浏览 2020-11-02 00:22 来自相关话题

Python列表去重在Python应用编程中,是一种非常常见的应用技巧,有些场景下需要统计出来的列表中去重,避免重复统计。 1. 通过字典去重#!/usr/bin/env python3 ...查看全部

Python列表去重在Python应用编程中,是一种非常常见的应用技巧,有些场景下需要统计出来的列表中去重,避免重复统计。


1. 通过字典去重

#!/usr/bin/env python3
# _*_coding:utf-8_*_
# Description: List to heavy

job = ['Sale', 'Dev', 'OPS', 'Sale', 'Presale', 'Sale', 'Dev', 'Test', 'OPS']
jobs = {}.fromkeys(job).keys()
print(list(jobs))

结果:


['Sale', 'Dev', 'OPS', 'Presale', 'Test']

解释:


Python 字典 fromkeys() 函数用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值。


语法:


dict.fromkeys(seq[, value])
  • seq - 字典键值列表。
  • value - 可选参数, 设置键序列(seq)的值。

该方法返回一个新字典, .keys 函数以列表返回一个字典所有的键。



2. 通过集合去重

大家都知道在Python数据结构中集合是天生去重的,所以我们可以利用这一特性来达到列表去重的效果。


格式: list(set(mylist))


#!/usr/bin/env python3
# _*_coding:utf-8_*_
# Description: List to heavy

job = ['Sale', 'Dev', 'OPS', 'Sale', 'Presale', 'Sale', 'Dev', 'Test', 'OPS']
jobs = list(set(job))

由于采用集合,会导致原有的列表排序发生变化,此时可通过如下方法,保持列表原有顺序:


#!/usr/bin/env python3
# _*_coding:utf-8_*_
# Description: List to heavy

job = ['Sale', 'Dev', 'OPS', 'Sale', 'Presale', 'Sale', 'Dev', 'Test', 'OPS']
jobs = list(set(job))
jobs.sort(key=job.index)


3. 使用itertools模块

#!/usr/bin/env python3
# _*_coding:utf-8_*_
# Description: List to heavy
import itertools

job = ['Sale', 'Dev', 'OPS', 'Sale', 'Presale', 'Sale', 'Dev', 'Test', 'OPS']
job.sort()

job_group = itertools.groupby(job)
jobs = []
for k, g in job_group:
jobs.append(k)
print(jobs)

groupby 根据key(v)值分组的迭代器, 将key函数作用于原循环器的各个元素。根据key函数结果,将拥有相同函数结果的元素分到一个新的循环器。每个新的循环器以函数返回结果为标签。



4. 通过列表推导式去重

#!/usr/bin/env python3
# _*_coding:utf-8_*_
# Description: List to heavy

job = ['Sale', 'Dev', 'OPS', 'Sale', 'Presale', 'Sale', 'Dev', 'Test', 'OPS']

jobs = []
[ jobs.append(i) for i in job if i not in jobs]

通过列表推导式,判断在不在新列表中的元素则添加到新列表中。



5. 利用lambda匿名函数和 reduce 函数处理

#!/usr/bin/env python3
# _*_coding:utf-8_*_
# Description: List to heavy
from functools import reduce

job = ['Sale', 'Dev', 'OPS', 'Sale', 'Presale', 'Sale', 'Dev', 'Test', 'OPS']
func = lambda x,y:x if y in x else x + [y]
jobs = reduce(func, [[], ] + job)

Python parallel.futures如何检测失败的任务?

chris 回复了问题 2 人关注 1 个回复 626 次浏览 2020-10-17 15:00 来自相关话题

PHP5.4.45编译安装报错

空心菜 回复了问题 2 人关注 1 个回复 801 次浏览 2020-10-16 16:56 来自相关话题

Python如何替换掉字符串里面的单引号和双引号

空心菜 回复了问题 2 人关注 1 个回复 4179 次浏览 2020-09-24 19:02 来自相关话题

Python下判断文件是否为二进制文件的三种方法

OpenSkill 发表了文章 0 个评论 1481 次浏览 2020-09-18 18:27 来自相关话题

常用的有两种方法判断文件是否为二进制文件,最准确的就是把这两种方法结合起来更加准确点. 方法1利用codecs模块 ...查看全部

常用的有两种方法判断文件是否为二进制文件,最准确的就是把这两种方法结合起来更加准确点.


方法1利用codecs模块

它首先检查文件是否以BOM开始,如果不在初始8192字节内查找零字节:


import codecs

file_path = "/home/ubuntu/zgd/ztest/_gs418_510txp_v6.6.2.7.stk.extracted/test"

#: BOMs to indicate that a file is a text file even if it contains zero bytes.
_TEXT_BOMS = (
codecs.BOM_UTF16_BE,
codecs.BOM_UTF16_LE,
codecs.BOM_UTF32_BE,
codecs.BOM_UTF32_LE,
codecs.BOM_UTF8,
)


def is_binary_file(file_path):
with open(file_path, 'rb') as file:
initial_bytes = file.read(8192)
file.close()
return not any(initial_bytes.startswith(bom) for bom in _TEXT_BOMS) and b'\0' in initial_bytes

if __name__ == "__main__":
print is_binary_file(file_path)

上面is_binary_file()函数也可以改成下面的方式:


def is_binary_file(file_path):
with open(file_path, 'rb') as file:
initial_bytes = file.read(8192)
file.close()
for bom in _TEXT_BOMS:
if initial_bytes.startswith(bom):
continue
else:
if b'\0' in initial_bytes:
return True
return False


方法2利用magic模块

安装模块: pip install python-magic


def getFileType(ff):
mime_kw = 'x-executable|x-sharedlib|octet-stream|x-object' ###可执行文件、链接库、动态流、对象
try:
magic_mime = magic.from_file(ff, mime=True)
magic_hit = re.search(mime_kw, magic_mime, re.I)
if magic_hit:
return True
else:
return False
except Exception, e:
print e.message

最好的方法是对两种类型同时进行处理:


# -*- coding:utf-8 -*-
# @Author:zgd
# @time:2019/6/21
# @File:operateSystem.py

import magic
import re
import codecs

def is_binary_file_1(ff):
'''
根据text文件数据类型判断是否是二进制文件
:param ff: 文件名(含路径)
:return: True或False,返回是否是二进制文件
'''

TEXT_BOMS = (
codecs.BOM_UTF16_BE,
codecs.BOM_UTF16_LE,
codecs.BOM_UTF32_BE,
codecs.BOM_UTF32_LE,
codecs.BOM_UTF8,
)
with open(file_path, 'rb') as file:
CHUNKSIZE = 8192
initial_bytes = file.read(CHUNKSIZE)
file.close()
#: BOMs to indicate that a file is a text file even if it contains zero bytes.
return not any(initial_bytes.startswith(bom) for bom in TEXT_BOMS) and b'\0' in initial_bytes


def is_binwary_file_2(ff):
'''
根据magic文件的魔术判断是否是二进制文件
:param ff: 文件名(含路径)
:return: True或False,返回是否是二进制文件
'''

mime_kw = 'x-executable|x-sharedlib|octet-stream|x-object' ###可执行文件、链接库、动态流、对象
try:
magic_mime = magic.from_file(ff, mime=True)
magic_hit = re.search(mime_kw, magic_mime, re.I)
if magic_hit:
return True
else:
return False
except Exception, e:
return False


if __name__ == "__main__":
file_path = "/home/ubuntu/zgd/ztest/_gs418_510txp_v6.6.2.7.stk.extracted/D0"
print is_binary_file_1(file_path)
print is_binwary_file_2(file_path)
print any((is_binary_file_1(file_path), is_binwary_file_2(file_path)))


方法3判断是否有ELF头

根据文件中是否有ELF头进行判断文件是否为二进制文件


# 判断文件是否是elf文件
def is_ELFfile(filepath):
if not os.path.exists(filepath):
logger.info('file path {} doesnot exits'.format(filepath))
return False
# 文件可能被损坏,捕捉异常
try:
FileStates = os.stat(filepath)
FileMode = FileStates[stat.ST_MODE]
if not stat.S_ISREG(FileMode) or stat.S_ISLNK(FileMode): # 如果文件既不是普通文件也不是链接文件
return False
with open(filepath, 'rb') as f:
header = (bytearray(f.read(4))[1:4]).decode(encoding="utf-8")
# logger.info("header is {}".format(header))
if header in ["ELF"]:
# print header
return True
except UnicodeDecodeError as e:
# logger.info("is_ELFfile UnicodeDecodeError {}".format(filepath))
# logger.info(str(e))
pass

return False

Python下如何将字符串类型的列表转换为列表对象?

OS小编 回复了问题 3 人关注 1 个回复 1185 次浏览 2020-09-18 01:18 来自相关话题

使用vscode的扩展pylance写的Python代码引入自定义的包找不到

OS小编 回复了问题 3 人关注 1 个回复 5608 次浏览 2020-08-29 21:41 来自相关话题

Python清空文件,读取替换回写失败

空心菜 回复了问题 1 人关注 1 个回复 1101 次浏览 2020-09-18 13:05 来自相关话题

更多话题 >>

热门话题

更多用户 >>

热门用户

空心菜

0 个问题, 108 次赞同

koyo

13 个问题, 22 次赞同