繁体   English   中英

相同的python代码块在不同的时间给出不同的输出

[英]Same python code block gives different outputs at different time

我想创建一个单词词典。 字典看起来像

words_meanings= {
                "rekindle": "relight",
                "pesky":"annoying", 
                "verge": "border",
                "maneuver": "activity",
                "accountability":"responsibility",
                }

keys_letter=[]

for x in words_meanings:
  keys_letter.append(x)
print(keys_letter)

输出: rekindle , pesky, verge, maneuver, accountability

在这里, rekindle , pesky, verge, maneuver, accountability是关键,而relight, annoying, border, activity, responsibility是价值。

现在我想创建一个 csv 文件,我的代码将从文件中获取输入。

该文件看起来像

rekindle | pesky   |  verge |  maneuver |  accountability
relight  | annoying|  border|  activity |  responsibility

到目前为止,我使用此代码加载文件并从中读取数据。

from google.colab import files
uploaded = files.upload()
import pandas as pd 
data = pd.read_csv("words.csv")
data.head()
import csv
reader = csv.DictReader(open("words.csv", 'r'))
words_meanings = []
for line in reader:
  words_meanings.append(line)
print(words_meanings)

这是print(words_meanings)的输出

[OrderedDict([('\ufeffrekindle', 'relight'), ('pesky', 'annoying')])]

对我来说看起来很奇怪。

keys_letter=[]
for x in words_meanings:
  keys_letter.append(x)
print(keys_letter)

现在我创建了一个空列表并且只想附加键值。 但输出是[OrderedDict([('\rekindle', 'relight'), ('pesky', 'annoying')])]

我很困惑。 根据第一个代码块,它只包含键,但现在它同时包含键和它们的值。 我怎样才能克服这种情况?

我建议您使用同一行上的键和值来格式化 csv。 像这样

rekindle,relight
pesky,annoying
verge,border

这样下面的代码就可以工作了。

words_meanings = {}
with open(file_name, 'r') as file:
    for line in file.readlines():
        key, value = line.split(",")
        word_meanings[key] = value.rstrip("\n")

如果你想要一个键列表: list_of_keys = list(word_meanings.keys())

向文件中添加键和值:

def add_values(key:str, value:str, file_name:str):
    with open(file_name, 'a') as file:
        file.writelines(f"\n{key},{value}")

key = input("Input the key you want to save: ")
value = input(f"Input the value you want to save to {key}:")
add_values(key, value, file_name)```

您运行相同的代码块,但将其用于不同的对象,这会产生不同的结果。


首先你使用普通字典(检查type(words_meanings)

 words_meanings = {
            "rekindle": "relight",
            "pesky":"annoying", 
            "verge": "border",
            "maneuver": "activity",
            "accountability":"responsibility",
            }

for -loop 为您提供这本字典中的keys

你可以得到同样的

 keys_letter = list(words_meanings.keys())

甚至

 keys_letter = list(words_meanings)

稍后您在此列表中使用带有单个字典的列表(检查type(words_meanings)

 words_meanings = [OrderedDict([('\ufeffrekindle', 'relight'), ('pesky', 'annoying')])]

for -loop 为您提供此列表中的元素,而不是此列表中字典中的键。 因此,您将完整字典从一个列表移动到另一个列表。

你可以得到同样的

 keys_letter = words_meanings.copy()

甚至一样

 keys_letter = list(words_meanings)

from collections import OrderedDict
words_meanings = {
                "rekindle": "relight",
                "pesky":"annoying", 
                "verge": "border",
                "maneuver": "activity",
                "accountability":"responsibility",
                }

print(type(words_meanings))

keys_letter = []
for x in words_meanings:
  keys_letter.append(x)
print(keys_letter)

#keys_letter = list(words_meanings.keys())
keys_letter = list(words_meanings)
print(keys_letter)


words_meanings = [OrderedDict([('\ufeffrekindle', 'relight'), ('pesky', 'annoying')])]

print(type(words_meanings))

keys_letter = []
for x in words_meanings:
  keys_letter.append(x)
print(keys_letter)

#keys_letter = words_meanings.copy()
keys_letter = list(words_meanings)
print(keys_letter)

csv模块的默认字段分隔符是逗号。 您的 CSV 文件使用竖线或条形符号| ,并且这些字段似乎也是固定宽度的。 所以,你需要指定| 作为创建 CSV 阅读器时使用的分隔符。

此外,您的 CSV 文件被编码为 Big-endian UTF-16 Unicode 文本 (UTF-16-BE)。 该文件包含一个字节顺序标记 (BOM),但 Python 并未将其剥离,因此您会注意到字符串'\rekindle'包含 FEFF UTF-16-BE BOM。 这可以通过在打开文件时指定encoding='utf16'来解决。

import csv

with open('words.csv', newline='', encoding='utf-16') as f:
    reader = csv.DictReader(f, delimiter='|', skipinitialspace=True)
    for row in reader:
        print(row)

在你的 CSV 文件上运行这个会产生这个:

{'rekindle ': 'relight  ', 'pesky   ': 'annoying', 'verge ': 'border', 'maneuver ': 'activity ', 'accountability': 'responsibility'}

请注意,键和值中有尾随空格。 skipinitialspace=True删除了前导空格,但没有删除尾随空格的选项。 这可以通过从 Excel 导出 CSV 文件而不指定字段宽度来解决。 如果这不能完成,那么可以通过使用生成器预处理文件来修复它:

import csv

def preprocess_csv(f, delimiter=','):
    # assumes that fields can not contain embedded new lines
    for line in f:
        yield delimiter.join(field.strip() for field in line.split(delimiter))

with open('words.csv', newline='', encoding='utf-16') as f:
    reader = csv.DictReader(preprocess_csv(f, '|'), delimiter='|', skipinitialspace=True)
    for row in reader:
        print(row)

现在输出剥离的键和值:

{'rekindle': 'relight', 'pesky': 'annoying', 'verge': 'border', 'maneuver': 'activity', 'accountability': 'responsibility'}

因为我发现没有人能够帮助我回答。 最后,我在这里发布答案。 希望这会帮助其他人。

import csv
file_name="words.csv"
words_meanings = {}
with open(file_name, newline='', encoding='utf-8-sig') as file:
    for line in file.readlines():
        key, value = line.split(",")
        words_meanings[key] = value.rstrip("\n")
print(words_meanings)

这是将 csv 传输到字典的代码。 享受!!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM