Как я мог узнать, закончил ли цикл файлов проверять файлы, начинающиеся с того же имени? - PullRequest
0 голосов
/ 06 мая 2020

Каждая мета может иметь 1-5 базовых имен файлов, например: 1) handling 2) vehicles 3) carvariations 4) carcols 5) dlctext Я проверяю al oop, есть ли одно из этих базовых имен в метафайле - если это правда, я добавляю его в переменную

IDEA FOR THE FILES THATS IN THE FOLDER

name-handling.meta
name2-handling.meta
name2-carvarations.meta
name3-handling.meta
name3-dlctext.meta
name3-vehicles.meta

Мне нужен способ проверить, есть ли в файле c некоторые arttibutes - например указано в коде, и я хочу записать данные в файл __resource. lua отдельно для каждого файла. Пример ниже:

The Code :

    os.chdir(Paunch2 + '\\' + FolderCreatorName)

    ResourceData = open('__resource.lua', 'x')
    print('ResourceFile Were Openned')
    ResourceData = open('__resource.lua', 'w')
    ResourceData.write("resource_manifest_version '77731fab-63ca-442c-a67b-abc70f28dfa5'")

    os.chdir(Paunch2 + '\\' + FolderCreatorName)
    print('Entered the Folder :', Paunch2 + '\\' + FolderCreatorName, '\n\nLets Gooo We are inside the looping :D')

    for dirpath, dirnames, files in os.walk('.') :
        ResourceData.write("file {\n\n")
        for file in files :
            if file.endswith('.meta') and 'handling' in str(file):
                print('meta')
                HandlingFile = str(file)
                ResourceData.write(f"'{HandlingFile}',\n")
                print(f"data file 'HANDLING_FILE' '{HandlingFile}'")
            elif file.endswith('.meta') and 'vehicles' in str(file):
                VehiclesFile = str(file)
                ResourceData.write(f"'{VehiclesFile}',\n")
                print(f"data file 'VEHICLE_METADATA_FILE' '{VehiclesFile}'")
            elif file.endswith('.meta') and 'carvariations' in str(file):
                CarVariationsFile = str(file)
                ResourceData.write(f"'{CarVariationsFile}',\n")
                print(f"data file 'VEHICLE_VARIATION_FILE' '{CarVariationsFile}'")
            elif file.endswith('.meta') and 'carcols' in str(file):
                CarcolsFile = str(file)
                ResourceData.write(f"'{CarcolsFile}',\n")
                print(f"data file 'CARCOLS_FILE' '{CarcolsFile}'")
            elif file.endswith('.meta') and 'dlctext' in str(file):
                DLCTextFile = str(file)
                ResourceData.write(f"'{DLCTextFile}',\n")
                print('Dlctext is working')
            elif file.endswith('.meta') and 'vehiclelayouts' in str(file):
                LAYOUT = str(file)
                ResourceData.write(f"'{LAYOUT}',\n")
                print(f"data file 'VEHICLE_LAYOUTS_FILE' '{LAYOUT}'")

Output in the File that printing in :

resource_manifest_version '77731fab-63ca-442c-a67b-abc70f28dfa5'file {

'f777-carvariations.meta',
'f777-handling.meta',
'f777-vehicles.meta',
'superkart-carcols.meta',
'superkart-carvariations.meta',
'superkart-handling.meta',
'superkart-vehicles.meta',
'wmfenyr-carcols.meta',
'wmfenyr-carvariations.meta',
'wmfenyr-dlctext.meta',
'wmfenyr-handling.meta',
'wmfenyr-vehicles.meta',
file {

IT HAVE TO BE LIKE :

file {
   'f777-carvariations.meta',
   'f777-handling.meta',
   'f777-vehicles.meta',
}
file {
   'superkart-carcols.meta',
   'superkart-carvariations.meta',
   'superkart-handling.meta',
   'superkart-vehicles.meta',
}
file {
   'wmfenyr-carcols.meta',
   'wmfenyr-carvariations.meta',
   'wmfenyr-dlctext.meta',
   'wmfenyr-handling.meta',
   'wmfenyr-vehicles.meta',
}

что мне делать, чтобы это было так?

1 Ответ

0 голосов
/ 07 мая 2020

Объяснение

Есть много проблем с кодом, который вы опубликовали:

  1. open('__resource.lua', 'x') в начале может вызвать FileExistsError, если файл уже существует, но это вообще не нужно, поскольку файлы, открытые в режиме "w", автоматически создаются, если они не существуют
  2. Ваше изменение текущего рабочего каталога на Paunch2 + '\\' + FolderCreatorName дважды, что не обязательно
  3. Первый "file {\n\n" добавляется поверх "resource_manifest_version", потому что вы не добавляли символы новой строки в конце записи (для "resource_manifest_version")
  4. Вы добавляете два символа новой строки после каждого "file {", чего вы не хотите делать - он добавит две новые строки вместо одной
  5. Ваш код внутри второго for-l oop не очень DRY (Не повторяйтесь) - это не проблема сам по себе, но в целом это очень плохая практика
  6. Каждый раз, когда вы записываете имя файла в __resource.lua, вы не делаете отступ это (вы не используете символ "\t")
  7. После второго for-l * 105 3 *, вы хотите добавить "}\n", чтобы у вас была закрывающая скобка

Все вышеперечисленное приведет к тому, что ваш код будет выглядеть следующим образом:

import os

os.chdir(Paunch2 + '\\' + FolderCreatorName)

ResourceData = open('__resource.lua', 'w')
ResourceData.write(
    "resource_manifest_version '77731fab-63ca-442c-a67b-abc70f28dfa5'\n\n"
)

for dirpath, dirnames, files in os.walk('.'):
    # Only one newline character is necessary, you don't need to newline twice
    ResourceData.write("file {\n")

    # You're code wasn't very DRY (Don't Repeat Yourself),
    # so now all it's doing is writing: "\t'{file}',".
    # The "\t" is needed for the indentation,
    # "'{file}'" writes the filename (automatically converts it to a string
    # so no need to call `str(file)`) and ",\n" at the end is to fit the
    # format you asked for.
    for file in files:
        ResourceData.write(f"\t'{file}',\n")
        print(f"Data file: '{file}'")

    # Writes a "}" at the end with a newline character.
    ResourceData.write("}\n")

Судя по тому, что я вижу, вы этого не хотите. Вы хотите, чтобы имена файлов были разделены на разные file { }.

Решение

Для этого нам нужно сначала разделить все имена файлов по имени и только после мы просмотрели все файлы, можем ли мы начать запись в __resource.lua (если вы не уверены, что ваша файловая система сортирует имена файлов). Мы можем использовать dict для хранения имен, поскольку ключи и значения могут быть списками имен файлов:

import os

os.chdir(Paunch2 + '\\' + FolderCreatorName)

ResourceData = open('__resource.lua', 'w')
ResourceData.write(
    "resource_manifest_version '77731fab-63ca-442c-a67b-abc70f28dfa5'\n\n"
)

files_dict = {}

for dirpath, dirnames, files in os.walk('.'):
    for file in files:
        # Gets the name of the file (e.g. name portion of 'name-handling.meta' -> 'name')
        name = file.split("-")[0]
        try:
            # If the key 'name' exists, it gets appended to the 'files_dict[name]'
            files_dict[name].append(file)
        except KeyError:
            # If the key 'name' doesn't exist,
            # it creates a list at 'files_dict[name]' and adds file to it
            files_dict[name] = [file]

        print(f"Data file: '{file}'")

# Writes everything to '__resource.lua' - similar to how the previous code sample works
for value in files_dict.values():
    ResourceData.write("file {\n")

    for file in value:
        ResourceData.write(f"\t{file},\n")

    ResourceData.write("}\n")

Если файловая система сортирует имена файлов автоматически, мы можем просто проверить, соответствует ли имя текущего файла. file совпадает с именем последнего файла - если это так, просто добавьте файл в текущий file { }, в противном случае закройте текущий file { } и запустите новый:


import os

os.chdir(Paunch2 + '\\' + FolderCreatorName)

ResourceData = open('__resource.lua', 'w')
ResourceData.write(
    "resource_manifest_version '77731fab-63ca-442c-a67b-abc70f28dfa5'\n\n"
)

last_name = None

for file in os.listdir("."):
    if os.path.isfile(file):
        # Splits the name part of the filename (e.g. name-handling.meta -> name)
        name = file.split("-")[0]

        # If the name is not the same as the last one, start a new `file { }`
        if last_name != name:
            ResourceData.write("}\n")
            ResourceData.write("file {\n")

        # Add current file
        ResourceData.write(f"\t{file},\n")

        # Set 'last_name' to the current 'name'
        last_name = name

        print(f"Data file: '{file}'")

# Add a closing bracket at the end
ResourceData.write("}\n")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...