猿问

从 Binary 解码为 String 成 Set 将 string 拆分为

我有一个问题。我编写了以二进制模式(为了速度)读取文件的代码,然后将我从正则表达式匹配中读取的内容解码为一组。问题在于该集合采用这些解码后的字符串并将它们转换为字符。如果您有“14(xx) 23(WP)”,正则表达式将得到 WP 和 xx。应该发生的是,它随后将获取 WP 和 xx 并将其作为一个元素放入 logbinset 中。然而,当它出现时,它变成 {'W', 'P', 'x', 'x'} 而不是 {"WP", "xx"} 我在使用列表时没有这个问题。


但是我想避免使用列表,因为它包含重复项并且我不需要重复值。此外,集合的读取和迭代速度更快,我不需要额外的代码行来确保我的列表不会重复。


为什么我的琴弦会发生这种分裂?我还尝试在不解码的情况下接收二进制文件,但 Set 出于某种原因将其转换为 Int。我的程序和 Python 的集合结构有什么问题?:


def odfs_bin_conversion_table_check(bintablecsv, filename):

bincsv_df = pd.read_csv(bintablecsv)

setbincsv_df = set(bincsv_df['MicronBin'])

with open(filename, "rb", buffering=102400) as lines:

    regex = re.compile(rb"\d+\((.+)\)\s+\d+\((.+)\)")

    logbinset = set()

    logbinlist = []

    missingbins = ""

    for match in filter(bool, map(regex.search, lines)):  # if search in lines, put it in match

        #logbinset.update(match.group(1))  # put matches inside logbinset

        logbinset.update((match.group(1)).decode('UTF-8','strict'))

        logbinlist.append((match.group(1)).decode())

        print(match.group(1))

        #print((match.group(1)).decode() + " " + (match.group(1)).decode()) #visual check. Can be commented out

    for x in logbinset:

        print(x)

        if x not in setbincsv_df:

            print(type(x))

            #missingbins += x.decode() + ","

    if len(missingbins) > 0:

        return missingbins[:-1] + " are not in conversion table"


ibeautiful
浏览 163回答 1
1回答

摇曳的蔷薇

这与正则表达式或以二进制模式读取文件完全无关。set.update将其参数视为可迭代对象,并将可迭代对象的每个元素添加到集合中。字符串是可迭代的,其中迭代产生单个字符:>>> for x in 'WP':...     print(x)WP因此,对于set.update,这会产生一组字符:>>> s = set()>>> s.update('WP')>>> s{'W', 'P'}要将字符串"WP"作为一个项目添加到集合中,请使用以下add方法:>>> s = set()>>> s.add('WP')>>> s{'WP'}
随时随地看视频慕课网APP

相关分类

Python
我要回答