Как создать цикл с FOR во временном файле? - PullRequest
0 голосов
/ 31 октября 2018

Я работаю с зашифрованным файлом, но мне не удается создать цикл с for, чтобы прочитать его, прежде чем он будет закрыт и удален.

Мое намерение состоит в том, чтобы прочитать данные, указанные в зашифрованном файле, и зациклить их, чтобы присвоить каждой строке переменную.

Всякий раз, когда я выполняю свой код, Python просто идет до конца, не работая с расшифрованной информацией; Я полагаю, что это потому, что команда with закрывает его перед началом цикла.

Это то, что я хочу, не работает, ошибок тоже нет:

with open(input_file, 'rb') as fp:
  data = fp.read()

fernet = Fernet(key)
encrypted = fernet.decrypt(data)
with tempfile.TemporaryFile() as fp:
  fp.write(encrypted)
  for url in fp: #Python ignores the tempfile. I belive it is closed in the previous line.
    segment = url.strip()
    url = 'https://docs.python.org/3.3/tutorial/' + segment
    filename = segment + '.html'
    filePath = pjoin('Data/' + filename)
    response = urlopen(url)
    webContent = response.read()
    html_content = urlopen(url).read()
    matches = re.findall(b'string', html_content);

    if len(matches) == 0: 
      print(segment + ' unchanged.')

    else:  
      with open(filePath, 'wb') as w:
       w.write(webContent)

Это рабочий код (извините, попытался сделать его короче, но не смог):

with open(input_file, 'rb') as fp:
  data = fp.read()

fernet = Fernet(key)
encrypted = fernet.decrypt(data)

with open(output_file, 'wb') as fp:
    fp.write(encrypted)

with open(output_file) as fp:
    for url in fp:
      segment = url.strip()
      url = 'https://docs.python.org/3.3/tutorial/' + segment
      filename = segment + '.html'
      filePath = pjoin('Data/' + filename)
      response = urlopen(url)
      webContent = response.read()
      html_content = urlopen(url).read()
      matches = re.findall(b'string', html_content);

    if len(matches) == 0: 
      print(segment + ' unchanged.')

    else:  
      with open(filePath, 'wb') as w:
       w.write(webContent) 

Заголовок для обоих примеров (отдельно, чтобы сделать его короче):

#python 3.6.6

from urllib.request import urlopen
import urllib.request
from os.path import join as pjoin
import re, os, sys, tempfile, six, ctypes, time, fileinput
from cryptography.fernet import Fernet

print("[*] Checking list.dat for consistency . . .")
key = b'wTmVBRLytAmlfkctCuEf59K0LDCXa3sGas3kPg3r4fs=' #Decrypt list.dat
input_file = 'List.dat'
output_file = 'List.txt'

Содержание List.txt:

errors
classes
stdlib

Есть подсказки?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

@ LarryLustig в значительной степени ответил почему ваш код не работал, но IMO, если вы полностью удалите временный файл (что не должно быть необходимо), вам даже не нужно беспокоиться о курсоре , Смотрите ниже прокомментированные изменения вашего желаемого кода.

# We'll use os.linesep to get the line terminator string for your os.
import os

...

with open(input_file, 'rb') as fp:
  data = fp.read()

fernet = Fernet(key)

# decode your decrypted bytes into strings.  Change 'utf-8' into whichever file encoding you're using if necessary.
decrypted = fernet.decrypt(data).decode('utf-8')

# Don't write to a temp file
# Iterate directly on each line of the extracted data
for url in decrypted.split(os.linesep): 
    segment = url.strip()
    url = 'https://docs.python.org/3.3/tutorial/' + segment
    filename = segment + '.html'
    filePath = pjoin('Data/' + filename)
    response = urlopen(url)
    webContent = response.read()
    html_content = urlopen(url).read()
    matches = re.findall(b'string', html_content);

    if len(matches) == 0: 
      print(segment + ' unchanged.')

    else:  
      with open(filePath, 'wb') as w:
       w.write(webContent)

В качестве альтернативы, если вы точно знаете, какой терминатор строки используется в файле (например, \r\n или \n), тогда вы можете полностью исключить использование os.linesep.

0 голосов
/ 31 октября 2018

Проблема в том, что после записи в файл «указатель файла» находится на конце файла. Там нечего читать.

Вы можете использовать seek метод , чтобы изменить положение указателя файла в начале. Кроме того, закрытие и повторное открытие файла (как в вашем рабочем коде) поместит указатель в начало файла.

...