Как исправить ошибку «FileNotFoundError: [Errno 2] Нет такого файла или каталога» при замене строки в загруженном коде файла? - PullRequest
0 голосов
/ 20 октября 2019

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

Я думаю, я не могу получить файл, который я загрузил через веб-форму. Я загружаю файл в папку «static / uploads» и вижу его там. Мне нужна помощь, чтобы получить загруженный файл, а затем определить кодировку, заменить символы и сохранить.

Я работаю на ПК с Windows, Python 3.7.

import os
from chardet import detect
from app import app
from flask import render_template, flash, redirect,  request
from werkzeug.utils import secure_filename

ALLOWED_EXTENSIONS = set(['txt', 'srt'])
target_format = 'UTF-8'
outputDir = 'static/coverted'


def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS


@app.route('/')
def upload_form():
    return render_template('index.html')



@app.route('/upload', methods=['POST'])
def upload_file():
    if request.method == 'POST':
        # check if the post request has the file part
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)
        file = request.files['file']
        if file.filename == '':
            flash('No file selected for uploading')
            return redirect(request.url)
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

            with open(filename, 'rb') as f:
                raw_data = f.read()
            source_format = detect(raw_data)['encoding']

            with open(filename, 'rU', source_format) as sf, open(outputDir + '/' + filename, 'w',
                                                                  encoding='UTF-8') as tf:
                content = sf.read()
                replaced_content = content.replace('Ý', 'İ').replace('ý', 'ı').replace('þ', 'ş').replace('ð', 'ğ').replace('Þ', 'Ş')
                tf.write(replaced_content)
            return redirect('/')
    else:
        flash('Allowed file types are txt,srt')
        return redirect(request.url)

В результате я получил: AttributeError: 'FileNotFoundError: [Errno 2] Нет такого файла или каталога:

1 Ответ

0 голосов
/ 21 октября 2019

Хорошо, мне удалось заменить содержимое, а затем сохранить его в файл после загрузки. Вот код, если кому-то еще нужно.

import os
from chardet import detect
from app import app
from flask import render_template, flash, redirect, request, send_from_directory, url_for
from werkzeug.utils import secure_filename

ALLOWED_EXTENSIONS = set(['txt', 'srt'])
target_format = 'UTF-8'
outputDir = 'static/coverted'


def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS


@app.route('/')
def upload_form():
    return render_template('index.html')


@app.route('/upload', methods=['POST'])
def upload_file():
    if request.method == 'POST':
        # check if the post request has the file part
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)
        file = request.files['file']
        if file.filename == '':
            flash('No file selected for uploading')
            return redirect(request.url)
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
            file.save(file_path)

            with open(file_path, 'rb') as f:
                raw_data = f.read()
            source_format = detect(raw_data)['encoding']
            print(source_format)

            with open(file_path, 'rU', encoding=source_format) as sf:
                content = sf.read()
                replaced_content = content.replace('Ý', 'İ').replace('ý', 'ı').replace('þ', 'ş').replace('ð',
                                                                                                         'ğ').replace(
                    'Þ', 'Ş')
                print(file_path)

                with open(file_path, 'w', encoding=target_format) as tf:
                    tf.write(replaced_content)

                return redirect('/')
    else:
        flash('Allowed file types are txt,srt')
        return redirect(request.url)
...