打开来自os.listdir()的文件并比较其中的行?

2024-05-29 05:56:20 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,我正在写一个程序来帮助连接到无线网络。我已经把大部分都写下来了(事实上,它是完整的)。我只是在开发额外的功能。)

我正在为ArchLinux操作系统的无线网络连接后端编写一个名为NetCTL的GUI前端。基本上,人们可以手动创建配置文件并为其命名(即“asdfasdfasdf”),但我的总是生成$NetworkSSID_wifiz。

但是,每个文件中都有一行,可以确定它是否适用于同一个网络。

这条线是:

ESSID='$NetworkSSID'

那么,如何打开中显示的每个文件操作系统列表目录然后检查这两个文件是否有相同的行(最好不要产生太多开销)?

所有配置文件都保存在/etc/netctl中,无论是由我的程序生成的还是由用户生成的。

示例文件:

用户创建:

^{pr2}$

由我的程序创建:

Description='A profile generated by WiFiz for MomAndKids'
Interface=wlp2s0
Connection=wireless
Security=wpa
ESSID='MomAndKids'
Key='#######'
IP=dhcp

样品操作系统列表目录输出:

['hooks', 'interfaces', 'examples', 'ddwrt', 'MomAndKids_wifiz', 'backups', 'MomAndKids']

Tags: 文件用户程序功能目录列表配置文件gui
2条回答
import os

all_essid = []

for file in os.listdir('.'):

    if not os.path.isfile(file):
        break

    with open(file) as fo:
        file_lines = fo.readlines()

    for line in file_lines:

        if line.startswith('ESSID')

            if line in all_essid:
                print 'duplicate essid %s' % line

            all_essid.append(line)

或者,如果您想进入目录,可以尝试os.walk

^{pr2}$

这应该对您有用:

from glob import glob
from os import path

config_dir = '/etc/netctl'

profiles = dict((i, {'full_path': v, 'ESSID': None, 'matches': []}) for (i, v) in enumerate(glob(config_dir + '/*')) if path.isfile(v))

for K, V in profiles.items():
    with open(V['full_path']) as f:
        for line in f:
            if line.startswith('ESSID'):
                V['ESSID'] = line.split('=',1)[1].strip()
                break # no need to keep reading.
    for k, v in profiles.items():
        if K == k or k in V['matches'] or not v['ESSID']:
            continue
        if V['ESSID'] == v['ESSID']:
            V['matches'].append(k)
            v['matches'].append(K)

for k, v in profiles.items():
    print k, v

相关问题 更多 >

    热门问题