文件操作
1. 大文件读取问题
有一个jsonline格式的文件file.txt大小约为10K,如何读取内容?
#! -*-conding=: UTF-8 -*-
# 2024/1/19 16:46
def get_lines():
with open('file.txt', 'rb') as f:
return f.readlines()
if __name__ == '__main__':
for line in get_lines():
print(line) # 处理每一行数据
现在要处理一个大小为10G的文件
,但是内存只有4G
,如果在只修改get_lines
函数而其他代码保持不变的情况下,应该如何实现?需要考虑的问题都有那些?
#! -*-conding=: UTF-8 -*-
# 2024/1/19 16:46
def get_lines():
with open('file.txt', 'rb') as f:
for i in f:
yield i
if __name__ == '__main__':
for line in get_lines():
print(line) # 处理每一行数据
个人认为:还是设置下每次返回的内容较好,否则读取次数太多。
#! -*-conding=: UTF-8 -*-
# 2024/1/19 16:46
def get_lines():
with open('file.txt', 'r', encoding='utf-8') as f:
_lines = []
for line in f:
_lines.append(line.strip())
if len(_lines) == 2:
yield _lines
_lines = []
if _lines:
yield _lines
if __name__ == '__main__':
for lines in get_lines():
print(lines) # 处理每两行数据
使用itertools
:
import itertools
def get_lines(line):
with open('file.txt', 'r', encoding='utf-8') as f:
while True:
_lines = list(itertools.islice(f, line))
if len(_lines) < line:
yield [line.strip() for line in _lines]
break
yield [line.strip() for line in _lines]
if __name__ == '__main__':
for lines in get_lines(2):
print(lines) # 处理每两行数据
使用mmap库
from mmap import mmap
def get_lines(fp):
with open(fp, "r+") as f:
m = mmap(f.fileno(), 0)
start = 0
while True:
pos = m.find(b"\n", start)
if pos == -1:
break
yield m[start:pos + 1].decode()
start = pos + 1
if __name__ == '__main__':
for lines in get_lines('file.txt'):
print(lines) # 处理每两行数据
要考虑的问题有:
- 内存只有4G无法一次性读入10G文件,需要分批读入分批读入数据要记录每次读入数据的位置。
- 分批每次读取数据的大小,太小会在读取操作花费过多时间。
https://stackoverflow.com/questions/30294146/fastest-way-to-process-a-large-file
2. 目录遍历
请打印指定目录的目录树
#! -*-conding=: UTF-8 -*-
# 2024/1/19 16:46
import os
def print_directory_contents(s_path):
"""
这个函数接收文件夹的名称作为输入参数
返回该文件夹中文件的路径
以及其包含文件夹中文件的路径
"""
for s_child in os.listdir(s_path):
s_child_path = os.path.join(s_path, s_child)
if os.path.isdir(s_child_path):
print_directory_contents(s_child_path)
else:
print(s_child_path)
if __name__ == '__main__':
print_directory_contents('.')
模块与包
3.输入日期, 判断这一天是这一年的第几天?
#! -*-conding=: UTF-8 -*-
# 2024/1/19 16:46
import datetime
def day_of_year():
year = input("请输入年份: ")
month = input("请输入月份: ")
day = input("请输入天: ")
date1 = datetime.date(year=int(year), month=int(month), day=int(day))
date2 = datetime.date(year=int(year), month=1, day=1)
return (date1 - date2).days + 1
if __name__ == '__main__':
print(day_of_year())
4.打乱一个排好序的list对象alist?
import random
alist = [1, 2, 3, 4, 5]
random.shuffle(alist)
print(alist)
数据类型
5.现有字典 d= {‘a’:24,‘g’:52,‘i’:12,‘k’:33}请按value值进行排序?
d = {
'a': 24, 'g': 52, 'i': 12, 'k': 33}
# 升序
d_set = sorted(d.items(), key=lambda x: x[1], reverse=False)
print(d_set) # [('i', 12), ('a', 24), ('k', 33), ('g', 52)]
# 降序
print(sorted(d.items(), key=lambda x: x[1], reverse=True))
# [('g', 52), ('k', 33), ('a', 24), ('i', 12)]
x[0]代表用key进行排序;x[1]代表用value进行排序。
6.字典推导式
创建一个字典,将列表中的元素作为键,元素的平方作为值
my_list = [1, 2, 3, 4, 5]
my_dict = {
x: x**2 for x in my_list}
print(my_dict) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
7.请反转字符串 “aStr”?
print("aStr"[::-1]) # rtSa
8.将字符串 “k:1 |k1:2|k2:3|k3:4”,处理成字典 {k:1,k1:2,…}
def process_string_to_dict(input_string):
# 去除字符串中的空格
input_string = input_string.replace(" ", "")
# 拆分字符串成键值对列表
pairs = input_string.split("|")
# 创建字典
my_dict = {
}
for pair in pairs:
key, value = pair.split(":")
my_dict[key] = int(value)
return my_dict
# 调用函数并打印结果
my_string = "k:1 |k1:2|k2:3|k3:4"
result_dict = process_string_to_dict(my_string)
print(result_dict) # {'k': 1, 'k1': 2, 'k2': 3, 'k3': 4}
# 字典推导式
print({
k: int(v) for t in my_string.split("|") for k, v in (t.split(":"),)})
# {'k': 1, 'k1': 2, 'k2': 3, 'k3': 4}
9.请按alist中元素的age由大到小排序
alist = [{
'name': 'a', 'age': 20}, {
'name': 'b', 'age': 30}, {
'name': 'c', 'age': 25}]
def sort_by_age(list1):
return sorted(list1, key=lambda x: x['age'], reverse=True)
print(sort_by_age(alist))
# [{'name': 'b', 'age': 30}, {'name': 'c', 'age': 25}, {'name': 'a', 'age': 20}]
10.下面代码的输出结果将是什么?
alist = ['a', 'b', 'c', 'd', 'e']
print(alist[10:]) # []
11.写一个列表生成式,产生一个公差为11的等差数列
print([x*11 for x in range(10)]) # [0, 11, 22, 33, 44, 55, 66, 77, 88, 99]
12.给定两个列表,怎么找出他们相同的元素和不同的元素?
list1 = [1, 2, 3]
list2 = [3, 4, 5]
set1 = set(list1)
set2 = set(list2)
print(set1 & set2) # {3}
print(set1 ^ set2) # {1, 2, 4, 5}
13.请写出一段python代码实现删除list里面的重复元素?
def duplicate_removal1(a):
"""使用集合去重"""
a = list(set(a))
print(a)
def duplicate_removal2(a):
"""将一个列表的数据取出放到另一个列表中,中间作判断"""
alist = []
for i in a:
if i not in alist:
alist.append(i)
# 如果需要排序的话用sort
alist.sort()
print(alist)
def duplicate_removal3(a):
"""使用字典"""
b = {
}
b = b.fromkeys(a)
c = list(b.keys())
print(c)
al = [1, <