import os import csv for files in os.walk("cleaned_datas_v2"): with open(files) as file: csv_reader = csv.reader(file) next(csv_reader) for row in csv_reader: print(row) Traceback (most recent call last): File "C:\Users\asus\PycharmProjects\pythonProject\main.py", line 4, in <module> with open(files) as file: TypeError: expected str, bytes or os.PathLike object, not tuple
时间: 2024-04-15 20:24:42 浏览: 160
您遇到的问题是由于`os.walk`返回的是一个元组,包含目录路径、子目录列表和文件列表。在使用`with open`打开文件时,需要传入文件的路径而不是元组。您可以使用`os.path.join`函数来拼接目录路径和文件名,然后打开文件。以下是修改后的代码示例:
```python
import os
import csv
for root, dirs, files in os.walk("cleaned_datas_v2"):
for file_name in files:
file_path = os.path.join(root, file_name)
with open(file_path) as file:
csv_reader = csv.reader(file)
next(csv_reader)
for row in csv_reader:
print(row)
```
这样修改后,代码将遍历指定目录下的所有文件,并逐个打开进行处理。
相关问题
帮我看看我的代码是否低效:import csv import os from transformers import AutoTokenizer, AutoModelForSequenceClassification import torch tokenizer = AutoTokenizer.from_pretrained('nlptown/bert-base-multilingual-uncased-sentiment') model = AutoModelForSequenceClassification.from_pretrained('nlptown/bert-base-multilingual-uncased-sentiment') i = 0 directory = "cleaned_datas_v2" for file in os.listdir(directory): with open('cleaned_datas_v2/' + file) as csvFile: rows = csv.reader(csvFile) with open("scored_reviews.csv", 'w', encoding="utf-8", newline="") as f: writer = csv.writer(f) for row in rows: i += 1 tokens = tokenizer.encode(row[0], return_tensors='pt') result = model(tokens) row.append(str(int(torch.argmax(result.logits)) + 1)) print(i) writer.writerow(row)
根据你提供的代码,以下是几个可能的改进点:
1. 在每次循环中打开和关闭文件:你的代码在每次循环中都打开和关闭了一个新的输出文件。这样做会导致性能下降,并且每个文件只包含一个行。你可以在循环之外打开输出文件,并在循环结束后关闭它。
2. 写入模式:你使用的写入模式是`'w'`,这意味着每次循环都会覆盖之前的内容。如果你想将所有行写入同一个文件,可以使用`'a'`模式(追加模式)。
3. 缓冲区大小:在写入大量数据时,使用较大的缓冲区大小可以提高写入性能。你可以尝试添加`buffering`参数来设置缓冲区大小,例如`buffering=8192`。
4. 批量处理数据:你的代码一次只处理一个数据行,这样可能会导致较慢的处理速度。你可以尝试批量处理数据行,将多个行一起输入到Bert模型中进行推断。这样可以减少模型推断的次数,提高效率。
根据以上建议,下面是代码改进的示例:
```python
import csv
import os
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
tokenizer = AutoTokenizer.from_pretrained('nlptown/bert-base-multilingual-uncased-sentiment')
model = AutoModelForSequenceClassification.from_pretrained('nlptown/bert-base-multilingual-uncased-sentiment')
directory = "cleaned_datas_v2"
with open("scored_reviews.csv", 'w', encoding="utf-8", newline="", buffering=8192) as f:
writer = csv.writer(f)
i = 0
for file in os.listdir(directory):
with open(os.path.join(directory, file)) as csvFile:
rows = csv.reader(csvFile)
for row in rows:
i += 1
tokens = tokenizer.encode(row[0], return_tensors='pt')
result = model(tokens)
row.append(str(int(torch.argmax(result.logits)) + 1))
print(i)
writer.writerow(row)
```
请注意,这只是对你提供的代码的一种改进示例。具体效果还需要根据你的数据集大小和系统环境进行评估。
import csv import re # 打开CSV文件 with open('/Users/rachel_lrq/Desktop/浙江省海洋经济.csv', 'r', encoding='utf-8') as file: csv_reader = csv.reader(file) # 创建写入CSV文件的列表 cleaned_data = [] for row in csv_reader: # 对每一行的文本进行清洗 pattern = r':(.*)' cleaned_row = [re.search(pattern, text).group(1) if re.search(pattern, text) else '' for text in row] cleaned_data.append(cleaned_row) # 将清洗后的数据写入新的CSV文件 with open('/Users/rachel_lrq/Desktop/cleaned_data.csv', 'w', newline='', encoding='utf-8') as file: csv_writer = csv.writer(file) # 写入清洗后的数据 csv_writer.writerows(cleaned_data)
你的代码基本上是正确的,只是需要稍作修改。首先,你需要将正则表达式的模式 `r':(.*)'` 改为 `r'[^:]*:(.*)'`,这样可以确保匹配第一个冒号后的所有内容。此外,你还需要导入 `csv` 和 `re` 模块。
下面是修改后的代码:
```python
import csv
import re
# 打开CSV文件
with open('/Users/rachel_lrq/Desktop/浙江省海洋经济.csv', 'r', encoding='utf-8') as file:
csv_reader = csv.reader(file)
# 创建写入CSV文件的列表
cleaned_data = []
for row in csv_reader:
# 对每一行的文本进行清洗
pattern = r'[^:]*:(.*)'
cleaned_row = [re.search(pattern, text).group(1) if re.search(pattern, text) else '' for text in row]
cleaned_data.append(cleaned_row)
# 将清洗后的数据写入新的CSV文件
with open('/Users/rachel_lrq/Desktop/cleaned_data.csv', 'w', newline='', encoding='utf-8') as file:
csv_writer = csv.writer(file)
# 写入清洗后的数据
csv_writer.writerows(cleaned_data)
```
在这个例子中,我假设你的原始CSV文件路径是 `/Users/rachel_lrq/Desktop/浙江省海洋经济.csv`,清洗后的数据将会写入 `/Users/rachel_lrq/Desktop/cleaned_data.csv`。你可以根据自己的实际情况修改文件路径。
阅读全文