Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python枚举一些文本文件?_Python_Enumerate - Fatal编程技术网

如何使用python枚举一些文本文件?

如何使用python枚举一些文本文件?,python,enumerate,Python,Enumerate,我想制作一个程序,使用Openpyxl自动化excel任务。我使用“枚举”打开一些文本文件,然后自动输入excel文件 import os os.chdir(r'F:\tes') filenames = ["eb.txt", "ea.txt"] for i, filename in enumerate(filenames): file = open(filename, 'r') text = file.read().replace('\u2014', '-').replace('â

我想制作一个程序,使用Openpyxl自动化excel任务。我使用“枚举”打开一些文本文件,然后自动输入excel文件

import os
os.chdir(r'F:\tes')

filenames = ["eb.txt", "ea.txt"]

for i, filename in enumerate(filenames):

  file = open(filename, 'r')
  text = file.read().replace('\u2014', '-').replace('—', '-')

  start = 0 
  startcheck = True
  end = 0
  endcheck = True

  for idx, letter in enumerate(text):

  if text[idx:idx+4] == 'NPWP' and startcheck:
    start = idx + 7
    startcheck = False

  if text[idx:idx+7] == 'Pembeli' and endcheck:
    end = idx
    endcheck = False

 data = text[start:end]

 from openpyxl import load_workbook
 wb = load_workbook(filename = r'F:\tes\Book1.xlsx')
 sheet_ranges = wb['1771 III']
 cell_name = 'M' + str(20 + (3*i))
 sheet_ranges[cell_name] = data
 wb.save(filename = r'F:\tes\Form 1771.xlsx')

我尝试打开2个文本文件,但它只打开并将1个文本文件输入excel。如何编写代码以打开多个文本文件?

重新定位一些语句,并确保语句位于适当的循环中(正确的缩进)。我没有测试过这个,但它看起来是正确的

首先,在开始时导入和设置所有内容

import os
from openpyxl import load_workbook

os.chdir(r'F:\tes')
filenames = ["eb.txt", "ea.txt"]
wb = load_workbook(filename = r'F:\tes\Book1.xlsx')
然后开始迭代

# outer loop
for i, filename in enumerate(filenames):

    file = open(filename, 'r')
    text = file.read().replace('\u2014', '-').replace('—', '-')
    # explicitly close the file
    file.close()

    start = 0 
    startcheck = True
    end = 0
    endcheck = True

    # find the data
    # inner loop
    for idx, letter in enumerate(text):

        if text[idx:idx+4] == 'NPWP' and startcheck:
            start = idx + 7
            startcheck = False

        if text[idx:idx+7] == 'Pembeli' and endcheck:
            end = idx
            endcheck = False

    # ensure this section in the outer loop
    data = text[start:end]
    sheet_ranges = wb['1771 III']
    cell_name = 'M' + str(20 + (3*i))
    sheet_ranges[cell_name] = data
最后保存工作簿。缩进确保在所有数据写入后保存

wb.save(filename = r'F:\tes\Form 1771.xlsx')

这可能是确保文件关闭的最好方法

with open(filename, 'r') as f:
    text = f.read().replace('\u2014', '-').replace('—', '-')
在您的示例中,您使用enumerate对文件中的每个字符进行迭代,以查找数据开始和结束的索引,
text[idx:idx+4]=='NPWP'

字符串有一个可以为您实现这一点的参数

start = text.find('NPWP')
end = text.find('Pembeli', start)
data = text[start:end]
通过这些更改,您的代码将如下所示:

import os
from openpyxl import load_workbook

os.chdir(r'F:\tes')
filenames = ["eb.txt", "ea.txt"]

wb = load_workbook(filename = r'F:\tes\Book1.xlsx')

for i, filename in enumerate(filenames):

    with open(filename, 'r') as f:
        text = f.read().replace('\u2014', '-').replace('—', '-')

    start = text.find('NPWP')
    end = text.find('Pembeli', start)

    data = text[start:end]
    sheet_ranges = wb['1771 III']
    cell_name = 'M' + str(20 + (3*i))
    sheet_ranges[cell_name] = data

wb.save(filename = r'F:\tes\Form 1771.xlsx')

为什么需要在此处枚举
<代码>对于文件名中的文件名
效果很好。因为它包含错误“ValueError:太多的值无法解包(预期为2)”Hi@jodayme,我建议启动一个单独的脚本,只需对文件执行正确的迭代即可。尝试只打印两个文件的名称,而不使用enumerate<代码>文件名中的f:打印f。一旦您看到这项工作,您就可以构建程序的其余功能。您在下面的代码中所说的
ValueError
是不可能的。正如Adam所建议的,您应该首先检查
文件名中的对象
对于idx,enumerate(文本)中的字母:
在其套件中没有任何内容。上的
data=text[start:end]
中的行看起来不像是在外部循环的套件中。您可能希望开始使用四个空格来进行缩进,这使得缩进更容易查看,而且大多数Python程序员都使用这种约定。