Работа с большими текстовыми фрагментами в исходном коде Java

Убедитесь, что вы понимаете три значения возврата os.walk:

for root, subdirs, files in os.walk(rootdir):

имеет следующее значение:

  • root: Текущий путь, который является "

  • subdirs: файлы в root каталога типов
  • files: файлы в root (не в subdirs) типа, отличного от каталога

И используйте os.path.join вместо конкатенации косой чертой! Ваша проблема - filePath = rootdir + '/' + file - вы должны соединить текущую папку «walk» вместо самой верхней папки. Таким образом, это должно быть filePath = os.path.join(root, file). «Файл» BTW является встроенным, поэтому вы обычно не используете его как имя переменной.

Еще одна проблема - это ваши циклы, которые должны быть такими, например:

import os
import sys

walk_dir = sys.argv[1]

print('walk_dir = ' + walk_dir)

# If your current working directory may change during script execution, it's recommended to
# immediately convert program arguments to an absolute path. Then the variable root below will
# be an absolute path as well. Example:
# walk_dir = os.path.abspath(walk_dir)
print('walk_dir (absolute) = ' + os.path.abspath(walk_dir))

for root, subdirs, files in os.walk(walk_dir):
    print('--\nroot = ' + root)
    list_file_path = os.path.join(root, 'my-directory-list.txt')
    print('list_file_path = ' + list_file_path)

    with open(list_file_path, 'wb') as list_file:
        for subdir in subdirs:
            print('\t- subdirectory ' + subdir)

        for filename in files:
            file_path = os.path.join(root, filename)

            print('\t- file %s (full path: %s)' % (filename, file_path))

            with open(file_path, 'rb') as f:
                f_content = f.read()
                list_file.write(('The file %s contains:\n' % filename).encode('utf-8'))
                list_file.write(f_content)
                list_file.write(b'\n')

Если вы не знали, инструкция with для файлов является сокращением:

with open('filename', 'rb') as f:
    dosomething()

# is effectively the same as

f = open('filename', 'rb')
try:
    dosomething()
finally:
    f.close()
21
задан Rob Hruska 23 April 2009 в 17:40
поделиться

2 ответа

Хотя вы можете использовать определенные форматеры для преобразования и встраивания любого текстового файла или длинного литерала как строка Java (например, с переносами новой строки, необходимыми выходами и т. д.), я не могу вспомнить частые ситуации, когда вам понадобятся эти возможности. это работает на. Большие текстовые разделы, даже если они предназначены только для отображения или сравнения, являются данными и, таким образом, обычно хранятся вне системы. Стоимость чтения файла (или даже кеширования результата в памяти) довольно низка. Интернационализация проще. Менять проще. Контроль версий проще. Другие инструменты (например, средства проверки орфографии) могут быть легко использованы.

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

То же самое относится и к XML. Фактически, для XML я бы сказал, что во многих случаях вы захотите прочитать XML и построить дерево DOM, которое вы затем сравниваете, а не сравниваете текст, на который могут влиять пробелы. И ручное создание XML-дерева в вашем модульном тесте ужасно.

И ручное создание XML-дерева в вашем модульном тесте ужасно.

И ручное создание XML-дерева в вашем модульном тесте ужасно.

0
ответ дан 29 November 2019 в 22:17
поделиться

Если текст статический или может быть параметризован, возможное решение - сохранить его во внешнем файле и затем импортировать. Однако это создает файловый ввод-вывод, который может быть ненужным или влиять на производительность. Использование этого решения потребовало бы кэширования содержимого файла, чтобы уменьшить количество операций чтения файла.

1
ответ дан 29 November 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: