writer.writerow 怎么控制输出内容不重复
时间: 2023-12-13 19:03:55 浏览: 67
要控制输出内容不重复,可以使用Python中的set()函数来存储已经输出的内容,并在写入数据之前检查要写入的数据是否已经在set()中存在。如果已经存在,则不写入,否则写入。以下是一个示例代码:
```python
import csv
output_set = set()
with open('output.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['Name', 'Age', 'Gender'])
# 写入数据,如果数据已经存在,则不写入
data = [['Tom', 18, 'Male'], ['Tom', 18, 'Male'], ['Jerry', 20, 'Male'], ['Bob', 22, 'Female']]
for row in data:
if tuple(row) not in output_set:
writer.writerow(row)
output_set.add(tuple(row))
```
在上面的代码中,我们首先定义了一个set()来存储已经输出的内容,然后打开一个CSV文件并创建一个csv.writer对象。在写入数据之前,我们检查要写入的数据是否已经在set()中存在。如果不存在,则将其写入文件并将其添加到set()中。
这样就可以避免输出重复的数据了。
相关问题
parser = argparse.ArgumentParser(description='Process log files and generate graphs.') parser.add_argument('input', metavar='INPUT', type=str, nargs='+', help='input log file(s)') parser.add_argument('--output', dest='output', type=str, default='output.csv', help='output CSV file name') args = parser.parse_args() # READ LOG def read_log_file(args): lines = [] with open(args.input, 'r') as f: for line in f: lines.append(line.strip()) return lines # FIND def wash_log_file(file_path,line): start_index = -1 for i, line in enumerate(lines): if 'Initialization of star.flow.EffectiveViscositySolver requires an additional pass...' in line: start_index = i + 1 if start_index == -1: print('Error: "Initialization of star" was not found in the log files.') exit() return lines[start_index] # DELETE def remove_duplicate_rows(line, start_index): unique_lines = [] for line in lines[start_index:]: if line not in unique_lines: unique_lines.append(line) return unique_lines # GET first line def save_log_as_csv(unique_lines, output_file): pattern = r'\bIteration|Continuity|X-momentum|Y-momentum|Z-momentum|Energy|Tke|Tdr|MassFlowReport.*?Pipe].*?\)|StaticPressure.*?Pipe].*?\)|Temperature.*?Pipe].*?\)|TotalPressure.*?Pipe].*?\)' with open(args.output, mode='w') as f: writer = csv.writer(f) headers = re.findall(pattern, unique_lines[0].strip()) writer.writerow(headers) for line in unique_lines[1:]: row = re.split(r'\s+', line.strip()) writer.writerow(row)
这段代码实现了一个命令行工具,用于处理日志文件并生成CSV文件。它使用argparse模块来解析命令行参数。其中,'input'参数是必需的,它表示输入的日志文件名。'output'参数是可选的,用于指定输出的CSV文件名,默认为'output.csv'。在程序中,read_log_file()函数用于读取日志文件并返回每行日志的列表。wash_log_file()函数用于找到日志文件中包含'Initialization of star.flow.EffectiveViscositySolver requires an additional pass...'的行,并返回该行下一行的内容。remove_duplicate_rows()函数用于去除日志文件中的重复行。save_log_as_csv()函数用于将处理后的日志文件写入CSV文件中。
在打开文件时,应该使用args.input[0]来获取第一个输入文件的文件名,因为args.input是一个列表,即使只有一个输入文件,也应该使用args.input[0]来获取它。在wash_log_file()函数中,应该将lines参数改为args.input,因为lines是未定义的变量。在remove_duplicate_rows()函数中,应该将line参数改为lines,因为line是未定义的变量。在save_log_as_csv()函数中,应该将args.output改为output_file,因为output_file是该函数的参数,而args.output是在命令行中解析得到的参数。另外,应该将re.findall()函数的返回值赋给headers变量,因为它返回的是一个列表,而不是一个字符串。
用python编写一个TF-IDF算法的完整代码。 要求:使用Counter包,语料库为整个csv文件,将已分词后的csv文件中的每行信息作为一个文档,并以列表形式呈现; 第一部分为导入信息; 第二部分为统计词频; 第三部分为TF计算过程; 第四部分为IDF计算过程; 第五部分为TF-IDF的计算过程; 第六部分为TF-IDF值排序(从大到小)及信息储存。 输入输出标注清楚;输入为已分词后的评论信息的csv文件(无需再分词),输出结果为排序后的词语及TF-IDF值,且无重复词语同时出现,输出形式为csv文档;标注详细清晰;以注释形式描述所使用的公式;计算过程均不运用向量。
以下是使用Python编写的TF-IDF算法的完整代码:
```python
import csv
from collections import Counter
import math
# 第一部分:导入信息
with open('data.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
corpus = [row for row in reader]
# 第二部分:统计词频
word_count = Counter()
for doc in corpus:
word_count.update(doc)
# 第三部分:TF计算过程
tf = {}
for doc in corpus:
doc_len = len(doc)
tf_doc = Counter(doc)
for word in tf_doc:
tf[(doc, word)] = tf_doc[word] / doc_len
# 第四部分:IDF计算过程
idf = {}
N = len(corpus)
for word in word_count:
count = sum(1 for doc in corpus if word in doc)
idf[word] = math.log(N / count)
# 第五部分:TF-IDF的计算过程
tf_idf = {}
for doc in corpus:
for word in set(doc):
tf_idf[(doc, word)] = tf[(doc, word)] * idf[word]
# 第六部分:TF-IDF值排序及信息储存
sorted_words = sorted(tf_idf, key=tf_idf.get, reverse=True)
unique_words = set(word for doc, word in sorted_words)
with open('tf_idf.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerow(['Word', 'TF-IDF'])
for word in unique_words:
writer.writerow([word, tf_idf[(doc, word)]])
```
其中,`data.csv`为已分词后的评论信息的csv文件,每一行代表一个文档。算法的主要过程如下:
1. 统计词频:使用`Counter`包对整个语料库中的词语进行统计;
2. 计算TF值:对于每个文档中的每个词语,计算其在文档中的出现频率除以文档长度;
3. 计算IDF值:对于每个词语,计算其在语料库中出现的文档数,然后用语料库的文档总数除以该值,再取对数;
4. 计算TF-IDF值:将TF值和IDF值相乘;
5. 排序并储存:将TF-IDF值从大到小进行排序,并将结果储存在`tf_idf.csv`文件中。
在运行代码前,请将`data.csv`文件放在同一目录下,并且确保文件中的每一行都已经进行了分词。输出结果为排序后的词语及TF-IDF值,且无重复词语同时出现,输出形式为csv文档。
阅读全文