我正在尝试更新 zip 存档中的文件并将其另存为新存档。我使用的 zip 存档是一个 Excel.xlsm
文件,我需要修改的文件位于子文件夹中:xl/vbaProject.bin
。我编写了一个函数(通过修改此处发布的函数:How to update one file inside zip file using python)。
def updateZip2(zip_name, file, data):
# generate a temp file
tmp = os.path.splitext(ntpath.basename(zip_name))[0] + '_new.xlsm'
tmpname = str(pathlib.Path(zip_name).parent.joinpath(tmp))
print(tmpname)
with zipfile.ZipFile(zip_name, 'r') as zin:
with zipfile.ZipFile(tmpname, 'w') as zout:
zout.comment = zin.comment # preserve the comment
for item in zin.infolist():
if item.filename.find(file) == -1:
zout.writestr(item, zin.read(item.filename))
Run Code Online (Sandbox Code Playgroud)
当我像这样调用这个函数时:
按预期创建了updateZip2('Book1.xlsm', r'xl\vbaProject.bin', target2)
一个新函数Book1_new.xlsm
,但我收到警告:
C:\ProgramData\Anaconda3\lib\zipfile.py:1355: UserWarning: Duplicate name: 'xl/vbaProject.bin'
return …
Run Code Online (Sandbox Code Playgroud) 我需要对熊猫执行的常见操作是从Excel文件中读取表格,然后从所有字段中删除分号。这些列通常是混合数据类型,在尝试执行以下操作时遇到了AtributeError:
for col in cols_to_check:
df[col] = df[col].map(lambda x: x.replace(';',''))
Run Code Online (Sandbox Code Playgroud)
AttributeError:“ float”对象没有属性“ replace”
当我str()
在替换之前将其包装时,Unicode字符有问题,例如
for col in cols_to_check:
df[col] = df[col].map(lambda x: str(x).replace(';',''))
Run Code Online (Sandbox Code Playgroud)
UnicodeEncodeError:'ascii'编解码器无法在位置3编码字符u'\ xe9':序数不在范围内(128)
在excel中,这是一个非常简单的操作,只需;
用一个空字符串替换即可。无论数据类型如何,我如何在整个数据帧中以类似的方式在熊猫中执行此操作?还是我错过了什么?
我有一个pandas DataFrame(df
),我需要搜索分号.我第一次尝试
semicolon_check = df.to_string().__contains__(';')
,
但它非常慢,如果是大型DataFrame,我会遇到内存错误.然后我尝试循环遍历列.str
,但不是所有列都是字符串,所以每当我到达数字列时,我收到一个错误
AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas
所以我最终得到了这段代码
for col in df.columns:
if df[col].dtype == 'O':
if df[col].str.contains(r';').any():
print 'found in ' + col
是否有更简单的方法来实现目标?上面的内容虽然按预期工作,但对于像价值搜索这样的基本任务来说似乎有点过分了.
我有一个before_flush
事件侦听器,用于检查员工的经理是否更改。在这种情况下,会在EmpManHist
表中自动创建记录。manager
是对Employee
表的自引用。这是我的表定义:
class Employee(Base):
__tablename__ = 'employees'
emp_id = Column(String, primary_key=True, unique=True)
name = Column(String, nullable=False)
manager_id = Column(String, ForeignKey('employees.emp_id'))
direct_reports = relationship('Employee', backref=backref('manager', remote_side=[emp_id]))
Run Code Online (Sandbox Code Playgroud)
当我通过manager_id
直接修改 ForeignKey ( )将新经理分配给员工时,它会被事件侦听器正确拾取。但是当我进行实例分配时,它不会:
# this code does not pick up the manager_id change in the 'before_flush' event listener
emp2.manager = emp3
dal.session.add(emp2)
dal.session.commit()
# this does
emp2.manager_id = '1'
dal.session.add(emp2)
dal.session.commit()
Run Code Online (Sandbox Code Playgroud)
这是为什么?我正在使用 python 3.6.3 和 sqlalchemy 1.1.13
以下是完整的工作示例:
from sqlalchemy import create_engine, Column, Integer, String, …
Run Code Online (Sandbox Code Playgroud) 我试图弄清楚正则表达式的语法,它将匹配4个字母数字字符,其中至少有一个字母.每个人都应该由包裹:>
和<
,但我不希望返回尖括号.
例如,当使用re.findall
字符串时,>ABCD<>1234<>ABC1<>ABC2
它应该返回['ABCD', 'ABC1']
.
1234
- 没有信
ABC2
- 没有用尖括号包裹