- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的类配置中有一个函数可以加载配置文本文件。在加载数据之前,如果用户手动修改了文件,该功能将检查文件,以免发生故障。
def load_config(self):
list_dat = []
list_str = []
with open(self.path, "r") as file:
for conf in file:
conf = conf.replace(": ", "|")
conf = conf.replace("\n", "")
try:
conf1, conf2 = conf.split("|")
except ValueError:
self.new_config()
break
try:
conf2 = ast.literal_eval(conf2)
except (ValueError, SyntaxError):
self.new_config()
break
if isinstance(conf2, tuple):
self.new_config()
break
list_str.append(conf1)
list_dat.append(conf2)
for x in range(0, len(list_str)):
if list_str[x] != self.conf_str[x]:
self.change_config(list_str[x], self.conf_str[x], x, text=True)
list_str[x] = self.conf_str[x]
for y in range(0, len(list_dat)):
if type(list_dat[y]) != type(self.list_default[y]):
self.change_config(list_dat[y], self.list_default[y], y)
list_dat[y] = self.list_default[y]
if len(list_dat) == 0 and len(list_str) == 0:
self.new_config()
app = wx.App(False)
width, height = wx.GetDisplaySize()
if list_dat[1] != width:
if list_dat[1] == self.list_default[1]:
if list_dat[0] == False:
self.change_config(list_dat[1], width, 1)
self.change_config(list_dat[2], height, 2)
list_dat[1] = width
list_dat[2] = height
else:
self.change_config(list_dat[1], width, 1)
self.change_config(list_dat[2], height, 2)
list_dat[1] = width
list_dat[2] = height
if list_dat[2] != height:
if list_dat[2] == self.list_default[2]:
if list_dat[0] == False:
self.change_config(list_dat[1], width, 1)
self.change_config(list_dat[2], height, 2)
list_dat[1] = width
list_dat[2] = height
else:
self.change_config(list_dat[1], width, 1)
self.change_config(list_dat[2], height, 2)
list_dat[1] = width
list_dat[2] = height
if list_dat[4] > 100:
self.change_config(list_dat[4], 100, 4)
list_dat[4] = 100
else:
if list_dat[4] < 0:
self.change_config(list_dat[4], 0, 4)
list_dat[4] = 0
if list_dat[5] > 100:
self.change_config(list_dat[5], 100, 5)
list_dat[5] = 100
else:
if list_dat[5] < 0:
self.change_config(list_dat[5], 0, 5)
list_dat[5] = 0
if list_dat[6] > 100:
self.change_config(list_dat[6], 100, 6)
list_dat[6] = 100
else:
if list_dat[6] < 0:
self.change_config(list_dat[6], 0, 6)
list_dat[6] = 0
if list_dat[7] > 100:
self.change_config(list_dat[7], 100, 7)
list_dat[7] = 100
else:
if list_dat[7] < 0:
self.change_config(list_dat[7], 0, 7)
list_dat[7] = 0
if list_dat[8] > 100:
self.change_config(list_dat[8], 100, 8)
list_dat[8] = 100
else:
if list_dat[8] < 0:
self.change_config(list_dat[8], 0, 8)
list_dat[8] = 0
self.main.id[20], self.main.id[9] = list_dat[0], list_dat[3]
self.main.id[4], self.main.id[5] = list_dat[1], list_dat[2]
self.main.id[11], self.main.id[13], self.main.id[15], self.main.id[17], self.main.id[19] = list_dat[4], list_dat[5], list_dat[6], list_dat[7], list_dat[8]
def change_config(self, old, new, n, text=False):
with open(self.path, "r") as file:
temp = file.readlines()
if text:
temp1, temp2 = temp[n].split(": ")
temp1 = temp1.replace(str(old), str(new))
temp[n] = temp1 + ": " + temp2
else:
temp[n] = temp[n].replace(str(old), str(new))
with open(self.path, "w") as file:
file.writelines(temp)
Display Set: True
Display Width: 1024
Display Height: 576
Fullscreen: False
Music Volume: 50
Sound Volume: 50
Voice Volume: 50
Ambient Volume: 50
Other Volume: 50
Display Set: True
Display Width: gfgfdd
Display Height: 576
Fullscreen: False
Music Volume: 50
Sound Volume: 50
Voice Volume: 50
Ambient Volume: 50
Other Volume: 50
if list_dat[4] > 100:
IndexError: list index out of range
Display Height
,
Music Volume
,
Sound Volume
,
Voice Volume
,
Ambient Volume
和
Other Volume
,也会发生相同的情况。
if list_dat[1] != width:
if list_dat[1] == self.list_default[1]:
if list_dat[0] == False:
self.change_config(list_dat[1], width, 1)
self.change_config(list_dat[2], height, 2)
list_dat[1] = width
list_dat[2] = height
else:
self.change_config(list_dat[1], width, 1)
self.change_config(list_dat[2], height, 2)
list_dat[1] = width
list_dat[2] = height
if list_dat[2] != height:
if list_dat[2] == self.list_default[2]:
if list_dat[0] == False:
self.change_config(list_dat[1], width, 1)
self.change_config(list_dat[2], height, 2)
list_dat[1] = width
list_dat[2] = height
else:
self.change_config(list_dat[1], width, 1)
self.change_config(list_dat[2], height, 2)
list_dat[1] = width
list_dat[2] = height
if list_dat[4] > 100:
self.change_config(list_dat[4], 100, 4)
list_dat[4] = 100
else:
if list_dat[4] < 0:
self.change_config(list_dat[4], 0, 4)
list_dat[4] = 0
if list_dat[5] > 100:
self.change_config(list_dat[5], 100, 5)
list_dat[5] = 100
else:
if list_dat[5] < 0:
self.change_config(list_dat[5], 0, 5)
list_dat[5] = 0
if list_dat[6] > 100:
self.change_config(list_dat[6], 100, 6)
list_dat[6] = 100
else:
if list_dat[6] < 0:
self.change_config(list_dat[6], 0, 6)
list_dat[6] = 0
if list_dat[7] > 100:
self.change_config(list_dat[7], 100, 7)
list_dat[7] = 100
else:
if list_dat[7] < 0:
self.change_config(list_dat[7], 0, 7)
list_dat[7] = 0
if list_dat[8] > 100:
self.change_config(list_dat[8], 100, 8)
list_dat[8] = 100
else:
if list_dat[8] < 0:
self.change_config(list_dat[8], 0, 8)
list_dat[8] = 0
import ast, os, wx
from pathlib import Path
class config_lib():
def __init__(self):
# IdDataDefaultConfig
self.id1 = True # SetDisplayDefault
self.id2 = 1024 # DisplayWidthDefault
self.id3 = 576 # DisplayHeightDefault
self.id4 = 1024 # DisplayWidthUser
self.id5 = 576 # DisplayHeightUser
self.id6 = 0 # LocationDisplayX
self.id7 = 50 # LocationDisplayY
self.id8 = False # FullscreenDefault
self.id9 = False # FullscreenUser
self.id10 = 50 # MusicVolumeDefault
self.id11 = 50 # MusicVolumeUser
self.id12 = 50 # SoundVolumeDefault
self.id13 = 50 # SoundVolumeUser
self.id14 = 50 # VoiceVolumeDefault
self.id15 = 50 # VoiceVolumeUser
self.id16 = 50 # AmbientVolumeDefault
self.id17 = 50 # AmbientVolumeUser
self.id18 = 50 # OtherAudioVolumeDefault
self.id19 = 50 # OtherAudioVolumeUser
self.id20 = True # SetDisplayUser
self.conf_str = ["Display Set", "Display Width", "Display Height", "Fullscreen", "Music Volume", "Sound Volume", "Voice Volume", "Ambient Volume", "Other Volume"]
self.list_default = [self.id1, self.id2, self.id3, self.id8, self.id10, self.id12, self.id14, self.id16, self.id18]
self.path = os.path.join("dat.bw3")
self.conf = Path(self.path)
try:
lc = self.conf.resolve()
except FileNotFoundError:
self.new_config()
else:
self.load_config()
def new_config(self):
list_dat = [[self.conf_str[0], self.id1], [self.conf_str[1], self.id2], [self.conf_str[2], self.id3], [self.conf_str[3], self.id8], [self.conf_str[4], self.id10], [self.conf_str[5], self.id12], [self.conf_str[6], self.id14], [self.conf_str[7], self.id16], [self.conf_str[8], self.id18]]
with open(self.path, "wt") as file:
for conf in list_dat:
print(conf[0], conf[1], sep=': ', file=file)
self.load_config()
def load_config(self):
list_dat = []
list_str = []
with open(self.path, "r") as file:
for conf in file:
conf = conf.replace(": ", "|")
conf = conf.replace("\n", "")
try:
conf1, conf2 = conf.split("|")
except ValueError:
self.new_config()
break
try:
conf2 = ast.literal_eval(conf2)
except (ValueError, SyntaxError):
self.new_config()
break
if isinstance(conf2, tuple):
self.new_config()
break
list_str.append(conf1)
list_dat.append(conf2)
for x in range(0, len(list_str)):
if list_str[x] != self.conf_str[x]:
self.change_config(list_str[x], self.conf_str[x], x, text=True)
list_str[x] = self.conf_str[x]
for y in range(0, len(list_dat)):
if type(list_dat[y]) != type(self.list_default[y]):
self.change_config(list_dat[y], self.list_default[y], y)
list_dat[y] = self.list_default[y]
if len(list_dat) == 0 and len(list_str) == 0:
self.new_config()
app = wx.App(False)
width, height = wx.GetDisplaySize()
if list_dat[1] != width:
if list_dat[1] == self.list_default[1]:
if list_dat[0] == False:
self.change_config(list_dat[1], width, 1)
self.change_config(list_dat[2], height, 2)
list_dat[1] = width
list_dat[2] = height
else:
self.change_config(list_dat[1], width, 1)
self.change_config(list_dat[2], height, 2)
list_dat[1] = width
list_dat[2] = height
if list_dat[2] != height:
if list_dat[2] == self.list_default[2]:
if list_dat[0] == False:
self.change_config(list_dat[1], width, 1)
self.change_config(list_dat[2], height, 2)
list_dat[1] = width
list_dat[2] = height
else:
self.change_config(list_dat[1], width, 1)
self.change_config(list_dat[2], height, 2)
list_dat[1] = width
list_dat[2] = height
if list_dat[4] > 100:
self.change_config(list_dat[4], 100, 4)
list_dat[4] = 100
else:
if list_dat[4] < 0:
self.change_config(list_dat[4], 0, 4)
list_dat[4] = 0
if list_dat[5] > 100:
self.change_config(list_dat[5], 100, 5)
list_dat[5] = 100
else:
if list_dat[5] < 0:
self.change_config(list_dat[5], 0, 5)
list_dat[5] = 0
if list_dat[6] > 100:
self.change_config(list_dat[6], 100, 6)
list_dat[6] = 100
else:
if list_dat[6] < 0:
self.change_config(list_dat[6], 0, 6)
list_dat[6] = 0
if list_dat[7] > 100:
self.change_config(list_dat[7], 100, 7)
list_dat[7] = 100
else:
if list_dat[7] < 0:
self.change_config(list_dat[7], 0, 7)
list_dat[7] = 0
if list_dat[8] > 100:
self.change_config(list_dat[8], 100, 8)
list_dat[8] = 100
else:
if list_dat[8] < 0:
self.change_config(list_dat[8], 0, 8)
list_dat[8] = 0
self.id20, self.id9 = list_dat[0], list_dat[3]
self.id4, self.id5 = list_dat[1], list_dat[2]
self.id11, self.id13, self.id15, self.id17, self.id19 = list_dat[4], list_dat[5], list_dat[6], list_dat[7], list_dat[8]
def change_config(self, old, new, n, text=False):
with open(self.path, "r") as file:
temp = file.readlines()
if text:
temp1, temp2 = temp[n].split(": ")
temp1 = temp1.replace(str(old), str(new))
temp[n] = temp1 + ": " + temp2
else:
temp[n] = temp[n].replace(str(old), str(new))
with open(self.path, "w") as file:
file.writelines(temp)
conf = config_lib()
__init__
中,它检查文件是否存在。如果不存在,则调用
new_config()
函数,该函数将使用默认数据创建一个新文件,然后调用
load_config()
函数。如果文件存在,则直接调用
load_config()
函数。
load_config()
函数必须先检查文件数据,然后再将其加载到程序中。
load_config()
函数的第一块:
try
中完成的,因此,如果文件内部有错误,则可以通过使用
new_config()
创建一个新文件来覆盖该文件。第二件事是将数据(当前为字符串)转换为有效数据。这是通过
ast.literal_eval()
完成的。再次,将所有内容放入
try
,原因与以前相同。最后,检查数据是单个数据而不是元组。数据名称和数据分别在
list_dat
和
list_str
中输入。
load_config()
函数的第二个块:
Except
块或
split()
块引发
ast.literal_eval()
。所以我补充说:
if len(list_dat) == 0 and len(list_str) == 0:
self.new_config()
load_config()
函数的第三块(这是给我问题的块):
if list_dat[1] != width:
if list_dat[1] == self.list_default[1]:
if list_dat[0] == False:
self.change_config(list_dat[1], width, 1)
self.change_config(list_dat[2], height, 2)
list_dat[1] = width
list_dat[2] = height
else:
self.change_config(list_dat[1], width, 1)
self.change_config(list_dat[2], height, 2)
list_dat[1] = width
list_dat[2] = height
if list_dat[2] != height:
if list_dat[2] == self.list_default[2]:
if list_dat[0] == False:
self.change_config(list_dat[1], width, 1)
self.change_config(list_dat[2], height, 2)
list_dat[1] = width
list_dat[2] = height
else:
self.change_config(list_dat[1], width, 1)
self.change_config(list_dat[2], height, 2)
list_dat[1] = width
list_dat[2] = height
if list_dat[4] > 100:
self.change_config(list_dat[4], 100, 4)
list_dat[4] = 100
else:
if list_dat[4] < 0:
self.change_config(list_dat[4], 0, 4)
list_dat[4] = 0
if list_dat[5] > 100:
self.change_config(list_dat[5], 100, 5)
list_dat[5] = 100
else:
if list_dat[5] < 0:
self.change_config(list_dat[5], 0, 5)
list_dat[5] = 0
if list_dat[6] > 100:
self.change_config(list_dat[6], 100, 6)
list_dat[6] = 100
else:
if list_dat[6] < 0:
self.change_config(list_dat[6], 0, 6)
list_dat[6] = 0
if list_dat[7] > 100:
self.change_config(list_dat[7], 100, 7)
list_dat[7] = 100
else:
if list_dat[7] < 0:
self.change_config(list_dat[7], 0, 7)
list_dat[7] = 0
if list_dat[8] > 100:
self.change_config(list_dat[8], 100, 8)
list_dat[8] = 100
else:
if list_dat[8] < 0:
self.change_config(list_dat[8], 0, 8)
list_dat[8] = 0
load_config()
函数的第四个块:
ast.literal_eval()
会引发异常,这就是为什么我将其放在
try
中的原因。发生这种情况时,将调用
new_config()
函数,并且循环应重新开始。因此,列表返回空白,并由检查再次填充。至少在理论上是这样。取而代之的是,虽然该文件被创建为新文件(带有默认数据),但该函数的其余部分将在第二次执行时分解。同样也是因为该错误仅由我输入的数据引起。对于具有布尔值且在第三个块中没有控件的其他对象(全屏等),则不会发生此问题。
最佳答案
在将脚本简化为这样的内容之后,
import ast
with open(self.path, "r") as file:
for conf in file:
conf = conf.replace(": ", "|")
conf = conf.replace("\n", "")
conf1, conf2 = conf.split("|")
conf2 = ast.literal_eval(conf2)
print(conf2)
Traceback (most recent call last):
File "/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2910, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-214-f993e6585bcd>", line 7, in <module>
conf2 = ast.literal_eval(conf2)
File "/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ast.py", line 85, in literal_eval
return _convert(node_or_string)
File "/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ast.py", line 84, in _convert
raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.Name object at 0x111f50f28>
try:
conf2 = ast.literal_eval(conf2)
except (ValueError, SyntaxError):
self.new_config()
break
InvalidIndex
错误。
ast.literal_eval()
引发异常,因为您的输入无法被评估为任何已知的python类型或方法。
关于python - 错误索引错误加载文件配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52024594/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!