1.txt文件的读
读文件demo:
with open('test.txt', 'r') as f:
for line in f:
# 遍历f中的每一行,开始对line进行操作
将文件读入数组中(文件中存放的得是数字)
import numpy as np
data = np.loadtxt("data.txt") #将文件中数据加载到data数组里
2.txt文件的写
写文件demo:这个也可以是覆盖写文件的格式,参数用w
with open('test.txt', 'w') as writers: # 打开文件
a = 'xxx'
writers.write(a) # 将内容写到文件中
writers.close() # 关闭文件,此处可以理解为保存
在一个文件尾部追加新内容demo:
with open('test.txt', 'a+') as writers: # 打开文件
a = 'xxx'
b = 'yyy'
writers.write(a + ‘,’ + b) # 将内容追加到到文件尾部
#如果要按行写入,我们只需要再字符串开头或结尾添加换行符'\n'
writers.write(a + '\n')
# 如果想要将多个变量同时写入一行中,可以使用writelines()函数,要求将传入的变量写成一个list:
writers.writelines([a, ',', b])
读写追加的主要区别,体现在open()函数中的mode参数上,关于open()的mode参数:
‘r’:读
‘w’:写, 覆盖写
‘a’:追加
‘r+’ == r+w(可读可写,文件若不存在就报错(IOError))
‘w+’ == w+r(可读可写,文件若不存在就创建)
‘a+’ ==a+r(可追加可写,文件若不存在就创建)
对应的,如果是二进制文件,就都加一个b就好啦:
‘rb’ ‘wb’ ‘ab’ ‘rb+’ ‘wb+’ ‘ab+’
3.python将文件内容按照某列值重新排序
python实现将文件内容按照某一列内容的大小值(不局限于数值,也可以是字母顺序)重新排序。
eg:将下面的内容按照第一列进行排序:
代码:
print(''.join(sorted(open('data.txt'), key=lambda s: s.split('\t')[0], reverse=1)))
排序前:
orgs 腾讯
orgs 腾讯
name 阿里
name 美团
name 华为
name 京东
orgs 网易
name 小米
orgs 上海
排序后:
orgs 腾讯
orgs 腾讯
orgs 网易
orgs 上海
name 阿里
name 美团
name 华为
name 京东
name 小米
文本排序后保存到txt文件中:
# 文本排序并保存
output_file = './search.txt'
output_file_sort = './search_sort.txt'
with open(output_file_sort, 'a') as writersort:
writersort.write(''.join(sorted(open(output_file), key=lambda s: s.split('\t')[0], reverse=1)))
4.内容去重
1.小文件去重实现
第一步,读取文件每一行,并处理掉换行符
第二步,将文件内容去重
第三步,写到新文件里
demo:
def file_remove_same(input_file, output_file):
"""
针对小文件去重
:param input_file: 输入文件
:param out_file: 去重后出文件
:return:
"""
with open(input_file, 'r', encoding='utf8') as f, open(output_file, 'a', encoding='utf8') as ff:
data = [item.strip() for item in f.readlines()] # 针对最后一行没有换行符,与其他它行重复的情况
new_data = list(set(data))
ff.writelines([item + '\n' for item in new_data if item]) # 针对去除文件中有多行空行的情况
2.大文件几十个G
就不能加载到内存中了,强行加载到内存中直接报内存错误
解决方案:
将文件按行读取,根据内容生成一个指纹(md5值或者其他唯一可识别的值),将指纹存集合中,当逐行读取的过程中判断集合中是否已经含有该行元素的指纹。如果指纹没有添加到集合中,则添加指纹到集合中并将此行追加输出到输出文件中。如果指纹已经在集合中了,说明此行与上面的某一行重复。
demo:
def gen_md5(data):
"""
生成md5
:param data: 字符串数据
:return:
"""
md5 = hashlib.md5()
md5.update(data.encode('utf-8'))
return md5.hexdigest()
def big_file_remove_same(input_file, output_file):
"""
针对大文件文件去重(将文件文件写在一行的,没有办法去重)
:param input_file:
:param output_file:
:return:
"""
finger_print_set = set()
with open(input_file, 'r', encoding='utf8') as f, open(output_file, 'w', encoding='utf8') as ff:
for line in f:
line_string = line.strip()
finger_print = gen_md5(line_string)
if finger_print not in finger_print_set:
finger_print_set.add(finger_print)
ff.write(line)