【问题标题】:Check if a file exists using a text file使用文本文件检查文件是否存在
【发布时间】:2017-10-02 22:21:01
【问题描述】:

我有一个文件夹(分子),其中包含许多代表不同分子的 sdf 文件(M00001.sdf、M00002.sdf 等)。我还有一个 csv,其中每一行代表一个分子(M00001、M00002 等)。 如果它们的名称是 csv 文件中的一行,我正在编写代码以获取 Molecules 文件夹中的文件。

第一次尝试

import os
path_to_files = '/path_to_folder/Molecules' # path to Molecules folder

for files in os.listdir(path_to_files):
    names = os.path.splitext(files)[0] # get the basename (molecule name)
        with open('molecules.csv') as ligs: # Open the csv file of molecules names
            for hits in ligs:
                if names == hits:
                    print names, hits
                else:
                    print 'File is not here'

但是,这在命令行上不返回任何内容(字面意思是什么都没有)。这段代码有什么问题?

【问题讨论】:

    标签: python csv operating-system


    【解决方案1】:

    我不确定这是不是最好的方法(我只知道以下代码适用于我的数据)但是如果您的 molecule.csv 具有标准 csv 格式,即“molecule1,molecule2 ,molecule3 ...",您可以尝试以这种方式重新排列您的代码:

    import os
    import csv
    path_to_files = '/path_to_folder/Molecules' # path to Molecules folder
    
    for files in os.listdir(path_to_files):
        names = os.path.basename(files)
        names = names.replace(".sdf","")
        with open('molecules.csv','r') as ligs:
            content = csv.reader(ligs)
            for elem in content:
                for hits in elem:
                    if names == hits:
                        print names, hits
                    else:
                        print 'File is not here'
    

    请参阅csv File Reading and Writing 了解 csv 模块

    【讨论】:

    • 其实是在打印else语句。
    • @MarcosSantana 确保名称和点击量确实相等(因为如果您将“molecule1.sdf”作为 name 并将“molecule1”作为 hits,您将拥有 else 语句)。在正确的位置检查 print namesprint hits
    • 刚刚检查过了。当我打印名称时,它显示分子1,就像我打印命中一样。我真的不知道为什么它不起作用。可以肯定的是,我只在文件夹上搜索了分子 1.sdf 并进行了检查,它就在那里。
    • 使用您的代码,内容中的每个元素都是一个列表(每个分子都是一个元素的列表,即分子名称)而不是一个字符串。也许这就是它不起作用的原因?
    • 在我的数据中,这是可行的,因为 hits 是列表 elem 的一个元素,即字符串列表。所以在 names (即一个字符串)和每个 hits (即一个字符串,它是字符串列表的一个元素)之间存在一个比较(即 == )。比较中是否有相同类型的变量?
    【解决方案2】:

    我用相当粗暴的方法解决了这个问题

    import os
    import csv
    import shutil
    
    path_to_files = None # path to Molecules folder
    new_path = None # new folder to save files
    os.mkdir(new_path) # create the folder to store the molecules
    
    hits = open('molecules.csv', 'r') 
    
    ligands = []
    
    for line in hits:
        lig = line.rstrip('\n')
        ligands.append(lig)
    
    for files in os.listdir(path_to_files):
        molecule_name = os.path.splitext(files)[0]
        full_name = '/' + molecule_name + '.sdf'
        old_file = path_to_files + full_name
        new_file = new_path + full_name
        if molecule_name in ligands:
            shutil.copy(old_file, new_file)
    

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      相关资源
      最近更新 更多