with open('test_result0.txt', 'r',encoding='utf-8') as f, openpyxl.Workbook() as wb: AttributeError: __enter__
时间: 2023-12-14 07:03:27 浏览: 206
这个错误通常是因为 `openpyxl.Workbook()` 没有返回一个 `with` 上下文管理器。解决方法是将 `openpyxl.Workbook()` 的返回值赋值给一个变量,然后将这个变量用于 `with` 语句。修改后的代码如下:
```python
import openpyxl
# 打开txt文件和Excel文件
with open('test_result0.txt', 'r', encoding='utf-8') as f:
wb = openpyxl.Workbook()
sheet = wb.active
sheet.title = 'Result'
# 逐行读取txt文件并处理
for line in f:
# 将"的tf-idf值为"替换成tab
line = line.replace('的tf-idf值为', '\t')
# 以tab为分隔符,分割字符串并保存到Excel文件中
parts = line.split('\t')
sheet.append([parts[0], float(parts[1])])
# 保存Excel文件
wb.save('result.xlsx')
```
这里将 `openpyxl.Workbook()` 的返回值赋值给 `wb` 变量,然后将这个变量用于 `with` 语句。这样就可以避免上述错误。
相关问题
import os import re import xlrd import xlwt print("当前路径:", os.getcwd()) file_path = os.getcwd() n = re.split(r'\\', file_path) path = file_path + '\\' + n[5] + ".xls" workbook = xlwt.Workbook(encoding='utf-8') for filename in os.listdir(file_path): if (os.path.splitext(filename)[-1] == ".txt"): data_sheet = workbook.add_sheet(filename[:-4]) data_sheet.write(0, 0, 'No.') data_sheet.write(0, 1, 'test_file_name') data_sheet.write(0, 2, 'rate_ratio') with open(filename, 'r') as f: data = f.readlines() key = 1 sheet_row = 1 while key >= 0: ret = re.search(".bin", data[key]) if ret != None: #print(key) #print(data[key]) #write to excel data_sheet.write(sheet_row, 0, key) data_sheet.write(sheet_row, 1, data[key]) sheet_row = sheet_row + 1 else: break key = key + 1 count = key - 1 count_idx = 1 sheet_row = 1 while key >= 0: ret = re.match("Tensor rate is ", data[key]) if ret != None: #print(count_idx, data[key]) data_sheet.write(sheet_row, 2, data[key][14:]) sheet_row = sheet_row + 1 count_idx = count_idx + 1 key = key + 1 if count_idx > count: break workbook.save(path) 优化上面的代码
上面的代码可以进行如下的优化:
1. 使用`os.path.join()`代替手动拼接路径,可以保证路径的正确性。
2. 使用`with open()`语句打开文件,可以自动管理文件的打开和关闭。
3. 使用正则表达式的`match()`方法代替`search()`方法,因为`search()`方法会在整个字符串中查找匹配,而`match()`方法只会从字符串开头开始匹配。
4. 将重复的代码段抽取为函数,以提高代码的可读性和复用性。
下面是优化后的代码:
```python
import os
import re
import xlwt
def process_file(filename, data_sheet):
with open(filename, 'r') as f:
data = f.readlines()
sheet_row = 1
for line in data:
if line.endswith('.bin\n'):
data_sheet.write(sheet_row, 0, sheet_row)
data_sheet.write(sheet_row, 1, line)
sheet_row += 1
elif line.startswith("Tensor rate is "):
data_sheet.write(sheet_row, 2, line[14:])
sheet_row += 1
def main():
file_path = os.getcwd()
n = re.split(r'\\', file_path)
path = os.path.join(file_path, n[5] + ".xls")
workbook = xlwt.Workbook(encoding='utf-8')
for filename in os.listdir(file_path):
if os.path.splitext(filename)[-1] == ".txt":
data_sheet = workbook.add_sheet(filename[:-4])
data_sheet.write(0, 0, 'No.')
data_sheet.write(0, 1, 'test_file_name')
data_sheet.write(0, 2, 'rate_ratio')
process_file(filename, data_sheet)
workbook.save(path)
if __name__ == '__main__':
main()
```
通过将重复的代码段抽取为函数`process_file()`,提高了代码的可读性和可维护性。同时,使用`os.path.join()`和`with open()`语句更加规范和安全地处理路径和文件操作。
import xlwt # 创建一个workbook 设置编码 workbook = xlwt.Workbook(encoding='utf-8') # 创建一个worksheet worksheet = workbook.add_sheet('My Worksheet') worksheet.write(0,0,label='label') worksheet.write(0,1,label='classes') for i in range(len(self.save_flow_member)): worksheet.write(i+1,0,label=self.save_flow_member[i]) worksheet.write(i+1,1,label=self.save_flow_name[i]) workbook.save('./data/show_label.csv') data = pd.read_excel('./data/show_label.csv', index_col=0) data.to_csv('./data/show_label.csv', encoding='utf-8')
import xlwt是Python中的一个模块,用于创建和操作Microsoft Excel文件。该模块可以用于写入或读取XLS文件,它提供了各种方法来创建Excel工作簿、工作表、单元格、样式等。通过该模块,可以对Excel文档进行分析和处理,实现数据的导入、导出和操作等。
阅读全文