【问题标题】:Need help creating a txt file in a folder which, is in the same directory需要帮助在同一目录中的文件夹中创建 txt 文件
【发布时间】:2019-05-15 08:49:38
【问题描述】:

我对 python 很陌生。我有一个作业问题,我们需要分析语料库然后比较它们。我们还必须在使用属性大小处理后将文件另存为 .txt 文件。

所以我需要在一个名为 trigram-models 的单独文件夹中创建一个 .txt 文件。 该文件夹与我的 python 文件位于同一目录中。我想我必须使用 os 模块,但我不确定如何。

这是我的代码:

from langdetect import read_trigrams, trigram_table, write_trigrams
import os

def make_profiles(datafolder, profilefolder, size):    

    filelist = []
    for file in os.listdir('./training'):
        filelist.append(file)
    print(filelist)

    for file in filelist:           
        filen = "./training/"+file
        print("fi", filen)

        maketable = trigram_table(filen, size)

        readdata = read_trigrams(filen)
        #print("re", readdata)

        splitname = str(file).split('-')
        newname = splitname[0] + "." + str(size) + '.txt'

        endtable = write_trigrams(readdata, newname)

    return (endtable)

make_profiles("./training", "./trigram-models", 20)

【问题讨论】:

  • 您能否更具体地说明您面临的问题是什么?这段代码会崩溃吗?它工作正常但没有产生你想要的结果吗?
  • 现在当我运行代码时,所有的文本文件都保存在与 python 文件相同的目录中。但我需要将文本文件保存在该目录的文件夹中。抱歉信息不足

标签: python file text directory


【解决方案1】:

要创建目录,我将使用以下格式,该格式依赖于 try / catch 并在目录已存在时防止错误:

dirName = 'tempDir'

try:
    # Create target Directory
    os.mkdir(dirName)
    print("Directory " , dirName ,  " Created ") 
except FileExistsError:
    print("Directory " , dirName ,  " already exists")

要更改目录,您可以使用以下命令:

os.chdir(directoryLocation)

我推荐阅读chapter 8 in automating the boring stuff with python

我希望这会有所帮助。如果您有任何问题,请随时提出。

【讨论】:

    【解决方案2】:

    首先,确保将方法中的所有代码都缩进,以便适当地括起来。

    您还将文件夹的相对路径(datafolder、profilefolder)作为方法参数传递,因此您应该在方法中使用它们。

    最后,要在文件夹中创建文件,我建议使用以下算法:

    file_path = '/'.join(profilefolder, newname)
    
    with open(file_path, 'w') as ouf:
        ouf.write(endtable)
    

    您可能需要将“endtable”替换为数据的字符串表示形式。

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      为了澄清 toti08 的回答,您应该将 os.absdir 替换为 os.path.absdir。

      filelist = [os.path.abspath(f) for f in os.listdir(data_folder)]
      

      而不是

      filelist = [os.abspath(f) for f in os.listdir(data_folder)]
      

      【讨论】:

        【解决方案4】:

        您的函数未使用参数profileFolder,您在其中指定了输出目录的名称。所以首先你应该在处理你的文件之前使用这些信息来创建一个文件夹。

        所以首先要做的是创建这个输出目录。 其次是将文件保存在那里,为此,您需要将文件名附加到输出目录。像这样的:

        def make_profiles(data_folder, output_folder, size):    
        
            filelist = []
            for file in os.listdir(data_folder):
                filelist.append(file)
        
            # Create output folder
            if not os.path.exists(output_folder):
                os.mkdir(output_folder)
        
            for file in filelist:           
                filen = "./training/"+file
                #print("fi", filen)
        
                splitname = str(file).split('-')
        
                # Create new file by appending name to output_folder
                newname = os.path.join(output_folder, splitname[0] + "." + str(size) + '.txt')
        
        
            return (endtable)
        
        make_profiles(./training, './trigram-models', 20)
        

        请注意,您还可以指定相对文件夹名称(即仅“trigram-models”),然后通过将此名称附加到当前路径来创建输出目录:

        output_folder = os.path.join(os.getcwd(), output_folder)
        

        另外(与问题无关)这段代码可以优化:

        filelist = []
        for file in os.listdir(data_folder):
            filelist.append(file)
        

        os.listdir已经返回了一个列表,所以你可以直接写:

        filelist = os.listdir(data_folder)
        

        但既然你对每个文件的绝对路径感兴趣,你最好这样做:

        filelist = [os.path.abspath(f) for f in os.listdir(data_folder)]
        

        您基本上获取os.listdir 返回的每个文件,并将其绝对路径附加到文件列表中。这样做你可以避免filen = "./training/"+file这一行。

        所以最后你的代码应该是这样的:

        def make_profiles(data_folder, output_folder, size):    
        
            filelist = [os.abspath(f) for f in os.listdir(data_folder)]
        
            # Create output folder
            if not os.path.exists(output_folder):
                os.mkdir(output_folder)
        
            for file in filelist:           
                splitname = str(file).split('-')
        
                # [...add other pieces of code]
        
                # Create new file by appending name to output_folder
                newname = os.path.join(output_folder, splitname[0] + "." + str(size) + '.txt')
        
                # [...add other pieces of code]
            return (endtable)
        
        make_profiles(./training, './trigram-models', 20)
        

        【讨论】:

        • 感谢您快速详细的回答!但是当我现在尝试运行程序时,我得到一个错误:“AttributeError:模块'os'没有属性'abspath'”。我已经导入了模块 os 和 os.path。但我仍然收到此错误。你知道为什么会发生这种情况以及我该如何解决这个问题吗?
        猜你喜欢
        • 2015-08-21
        • 1970-01-01
        • 1970-01-01
        • 2014-07-15
        • 1970-01-01
        • 1970-01-01
        • 2019-06-25
        • 2022-10-05
        • 2011-03-13
        相关资源
        最近更新 更多