python对txt文件的读写、覆盖写、追加内容、内容按列排序、内容去重

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)


参考:
1.去重:https://blog.csdn.net/ymmbjcz/article/details/94871766

  • 9
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值