先了解Python splitlines()用法
str.splitlines([keepends])
按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表,参数 keepends默认为 False,不保留换行符,如果为 True,则保留换行符。在处理中,建议默认不保留,在写入的时候在定义换行符。
json涉及字符串与字典的转换,需一行一行写入,txt可利用file.writelines(list)进行整体写入
import json
# f11(json文件),f22(txt文件)为原文件,f.f2为新写入文件
with open(casefile_path2, 'a+', newline='', encoding='utf-8') as f, \
open(casefile_path, 'r', encoding='utf-8') as f11:
# casefile为json文本,去重写入
casetmp = f11.read().splitlines()
print("casetmp", type(casetmp))# <class 'list'>
casetmp1 = list(set(casetmp)) # 利用内置集合去重
casetmp1.sort(key=casetmp.index) #排序
for each in casetmp1:
case = json.loads(each)
json.dump(case, f, sort_keys=True, ensure_ascii=False)
f.write("\n")
with open(factfile_path2, 'a+', newline='', encoding='utf-8') as f2, \
open(factfile_path, 'r', encoding='utf-8') as f22:
# factfile为txt ,去重写入
facttmp = f22.read().splitlines()
print("facttmp", type(facttmp)) # <class 'list'>
facttmp1 = list(set(facttmp)) # 利用内置set去重
facttmp1.sort(key=facttmp.index)
fact_article = [tmp + "\n" for tmp in facttmp1]
# 给每一行的结尾加一个换行符
f2.writelines(fact_article)
简化txt代码
with open('a.txt') as file1:
tmp_list = file1.read().splitlines()
tmp_new = set(tmp)#利用内置的集合去重
tmp_only = [tmp + "\n" for tmp in tmpnew]#给每一行结尾加换行符
with open('b.txt', 'w') as file2:
file2.writelines(tmp_only)
(这种.splitlines()方法需要注意,txt文本如果不规范,每一行以“\n”为换行符,但是一行内间含有“\n”特殊字符,这种文本就不适用,使用的结果是文本去重后,行数也许不减反降,这是因为它把文件中本是一行的数据拆分了,用这种方法的首先考虑自己的文件格式,其次可以用下面的程序“查看文件行数长度”进行检验)
去除重复行(法二:建造list或set检查是否已存在)
如果考虑到文本的长度是否会超出显示,可以截取单行前多少字符,进行比较,比如我的数据有唯一的标识符id,我就对唯一的进行比较,而不是整行进行比较,如果不考虑文本长度问题就可以直接添加进list或set判断。
import json
with open(casefile_path2, 'a+', newline='',encoding='utf-8') as f,\
open(factfile_path2, 'a+', newline='', encoding='utf-8') as f2, \
open(casefile_path, 'r', encoding='utf-8') as f11,\
open(factfile_path, 'r', encoding='utf-8') as f22,
lines_seen = set()
for line in f11:
case = json.loads(line)
id = case["ID"]
if id not in lines_seen:
lines_seen.add(id)
case = json.loads(line)
json.dump(case, f, sort_keys=True, ensure_ascii=False)
f.write('\n')
fact_article = f22.readline()
f2.write(fact_article)
简化代码:
read_Path='a.txt'
write_Path='b.txt'
lines_seen=set()
outfiile=open(write_Path,'a+',encoding='utf-8')
f=open(read_Path,'r',encoding='utf-8')
for line in f:
if line not in lines_seen:
outfiile.write(line)
lines_seen.add(line)
按行写入json/txt文件
def save_data(case,fact_article):
数据存储逻辑
global factfile_path
global casefile_path
with open(casefile_path, 'a+', encoding='utf-8') as f:
#case为一个字典
json.dump(case, f, sort_keys=True, ensure_ascii=False)
f.write('\n')
with open(factfile_path, 'a+', newline='', encoding='utf-8') as f2:
#fact_article为一个字符串
f2.write(fact_article)
f2.write('\n')
同时写入文件,将f11文件追加写入f。两个文件同步写入。json文件比较特殊需要一行一行进行。
with open(casefile_path, 'a+', newline='',encoding='utf-8') as f,\
open(factfile_path, 'a+', newline='', encoding='utf-8') as f2, \
open(casefile_path2, 'r', encoding='utf-8') as f11,\
open(factfile_path2, 'r', encoding='utf-8') as f22:
# print(type(f11))#<class '_io.TextIOWrapper'>
for line in f11:
case = json.loads(line) #line是str,case是字典
json.dump(case, f, sort_keys=True, ensure_ascii=False)
f.write('\n') #行末需要写入"\n"
fact_article = f22.readline()
f2.write(fact_article)
# f2.write('\n')#因为这一行文本,行末本就有"\n",所以不需要加换行
查看文件行数长度
def zhuijia(factfile_path):
# filename = "somefile.txt"
factfile = open(factfile_path, encoding='utf-8')
factfile_lines = len(factfile.readlines())
print( factfile_lines )
factfile.close()
目录去除重复行(法一:利用内置set)去除重复行(法二:建造list或set检查是否已存在)按行写入json/txt文件查看文件行数长度factfile_path 为json文件casefile_path 为txt文件去除重复行(法一:利用内置set)先了解Python splitlines()用法str.splitlines([keepends])按照行...
工作时经常会用到
python处理
json格式的数据,
通常
json.loads之后主要的数据通常是 list 里面包含很多的dict
直接用list(set()) 这种方式去重会报错
TypeError: unhashable type: 'dict'
所以自己写一个判断
重复的方法
def removeduplicate(list1):
列表套字典去
重复
:param list1: 输入一个有
重复值的列表
:return: 返回一个去掉
重复的列表
可以使用 Python 的 set 类型来实现这个功能。
首先,需要打开文件并读取所有行,然后将每行数据添加到一个 set 中。set 会自动去除重复的数据,所以最后得到的 set 就是去重后的数据。最后,可以将 set 中的数据写回到文件中。
以下是一个例子:
# 打开文件并读取所有行
with open('data.txt', 'r') as f:
lines = f.readline...
df = pd.read_csv(file_in)
df = df.drop_duplicates(subset=None, keep='first', inplace=False)
# df.to_csv(file_out,index = False)
subset: 列标签,可选
keep: {‘first’, ‘last’, False}, 默认值 ‘first’
first: 保留第一次出现的
重复项。
last: 删除
1.前言:
采用python中set()的概念,通过遍历原始文档中的元素,并将其添加到set()中,然后根据set()的性质来判断新的元素是否要被添加到新的文档中去。最终生成的新的文档即满足所需。
2.代码实现:
#coding:utf-8
readDir = "./original_file.txt"
writeDir = "./new_file.txt"
outfil...
Python字典的键是不允许重复的,json字典的键可以重复,如果要用Python构建一个键重复的json字符串该怎么处理好呢
我只想到了两个较简单的方法来达到这个目的
把有重复键值的部分先用一个特殊字符串标记,然后构造出有键重复的json字符串,然后替换进去
import json
json_data = {"params": "XXX"}
params_str = '{"key": "...
var tbdt = JSON.stringify(Data);//把JSON1转为字符串Data为需要在原有JSON上添加的JSON
var hvz;//localStorage.getItem("lstk")用于保存原有JSON字符串
int main() {
ifstream inputFile("E:/OneDrive/桌面/dian/wu1.txt");
vector<pair<int, int>> coordinates;
if (inputFile.is_open()) {
string line;
while (getline(inputFile, line)) {
int x, y;
sscanf(line.c_str(), "(%d,%d)", &x, &y);
coordinates.push_back(make_pair(x, y));
inputFile.close();
} else {
cout << "文件打开失败!" << endl;
return 1;
for (auto& p : coordinates) {
cout << "(" << p.first << "," << p.second << ")" << endl;
return 0;
在这个示例代码中,我们使用 `ifstream` 类型的对象 `inputFile` 打开了文件 `E:/OneDrive/桌面/dian/wu1.txt`。然后,我们按照前面的示例代码,读取文件中的坐标数据,并将它们存储到一个 vector 容器中。最后,我们输出 vector 容器中的所有坐标数据。
需要注意的是,如果文件打开失败,我们需要输出一条错误信息并返回一个非零值,以便通知调用者发生了错误。