我正在使用Github API和Python尝试在存储库中生成文件结构,但目录没有正确形成。为了验证和创建存储库,我使用Github库和create_file_structure
函数来构造文件结构,该结构作为字符串传递。该函数用于解析字符串,并使用create_file
函数在存储库中创建文件和目录。不幸的是,代码错误地解释了文件结构中的所有行,而不是创建准确的适当目录。
我不确定是什么原因导致了这个问题,但看起来create_file_structure
函数没有正确地识别文件结构中的目录。如果你能帮助我了解出了什么问题,我将不胜感激。
我尝试运行create_file_structure
函数并向它传递一个文件结构字符串,以及一个表示我想要创建文件结构的存储库的repo
对象。我希望该函数能够正确解析文件结构字符串,并在存储库中创建适当的文件和目录。
但是,该函数将文件结构字符串中的所有行视为文件,而不是创建适当的目录。这会导致文件结构被错误地创建,所有行都被视为文件,而不是文件和目录的正确组合。
下面是我试图创建的文件结构的一个例子:
dir1/
├── dir2/
│ ├── file1
│ └── file2
└── dir3/
├── file3
├── file4
└── dir4/
└── file5
下面是我得到的输出:
Successfully created file: dir1
Successfully created file: dir2/dir2
Successfully created file: dir2/file1
Successfully created file: dir2/file2
Successfully created file: dir2/dir3/dir3
Successfully created file: dir2/dir3/file3/file3
Successfully created file: dir2/dir3/file3/file4/file4
Successfully created file: dir2/dir3/file3/file4/dir4/dir4
Successfully created file: dir2/dir3/file3/file4/dir4/file5/file5
Successfully created file structure
这是我使用的完整main.py
:
from github import Github
def create_repository(username, token, repository_name):
g = Github(username, token)
repo = g.get_user().create_repo(repository_name)
print(f"Successfully created repository: {repository_name}")
return repo
def create_file_structure(repo, file_structure):
file_structure = file_structure.replace('├──', '|--').replace('└──', '`--')
lines = file_structure.strip().split('n')
current_dir = []
for line in lines:
line = line.strip()
if line.startswith('|--') or line.startswith('`--'):
if line.endswith('/'): current_dir.append(line[3:].strip())
else: current_dir.append(line[3:].strip())
create_file(repo, current_dir, line)
print('Successfully created file structure')
import re
def create_file(repo, current_dir, filename):
filename = filename.strip()
filename = re.sub('[^a-zA-Z0-9.]', '', filename)
current_dir = [d.rstrip('/') for d in current_dir]
filename = filename.rstrip('/')
if current_dir: path = '/'.join(current_dir + [filename])
else: path = filename
try:
repo.create_file(path, 'Initial commit', '')
print(f"Successfully created file: {path}")
except Exception as e:
print(f"Error creating file {path}: {e}")
def main():
username = input('Enter your GitHub username: ')
token = input('Enter your GitHub personal access token: ')
repository_name = input('Enter the repository name: ')
repo = create_repository(username, token, repository_name)
lines = []
while True:
line = input()
if line: lines.append(line)
else: break
file_structure = 'n'.join(lines)
create_file_structure(repo, file_structure)
if __name__ == '__main__': main()
要回答您的直接问题,在create_file_structure
函数中,您有以下行:
if line.startswith('|--') or line.startswith('`--'):
if line.endswith('/'): current_dir.append(line[3:].strip())
else: current_dir.append(line[3:].strip())
create_file(repo, current_dir, line)
在内部if语句中,检查该行是否以'/'结尾(表示目录),如果是,则将line
变量的一部分添加到current_dir
变量中。如果不是,那么你做同样的事情(!)因此,无论行是否表示目录,都要将line
变量的一部分添加到current_dir
变量中。接下来,在if语句之外调用create_file
,因此,无论行是否表示目录,都将从line
变量创建一个文件。
我认为你想说的是,如果这一行不代表一个目录,那么创建一个文件,例如:
if not line.endswith('/'):
create_file(repo, current_dir, line)
注意,这单独不会使您的代码从输入生成存储库中的文件结构。我认为你正在使用GitHub API正确,但你的字符串操作代码不会工作的方式,你想要它的工作。试着注释掉GitHub部分,并首先集中精力使用Python调试器或更多print语句调试字符串操作代码。
您必须至少再做一些更改才能使字符串操作正常工作。例如,请注意:
if line.startswith('|--') or line.startswith('`--')
不捕获作为文件的所有行。file1和file2的行不以这些符号开头。- 你的函数将创建一个路径为
dir2/dir3/file3/file3
的文件,这是不正确的。当您有嵌套目录时,在前三个字符之后使用line
字符将不起作用。尝试使用递归并在create_file_structure
中调用create_file_structure
,但在line
变量的子字符串上。