我有一个 DAG 程序,它处理和清理某些文件,将它们组合起来,然后进行额外的计算。我想要一种方法来运行整个分析管道,并在发生任何变化时重新运行,而不必重新处理每个组件。
我阅读了 Makefiles 并认为这听起来是完美的解决方案。我也知道它可能已经过时,并且可能存在更好的替代方案,但据我所知,我通常只找到大量不太适合此目的的工作流调度程序工具(例如,Airflow、Luigi、 Nextflow、Dagobah 等等等等)
似乎其中许多对于我并不真正需要的调度程序、GUI 等来说都是多余的。我只想要一个执行以下操作的文件:
生成文件示例:
.PHONY : dats
dats : isles.dat abyss.dat
isles.dat : books/isles.txt
python countwords.py books/isles.txt isles.dat
abyss.dat : books/abyss.txt
python countwords.py books/abyss.txt abyss.dat
.PHONY : clean
clean :
rm -f *.dat
Run Code Online (Sandbox Code Playgroud)
这是在python中运行类似程序的最佳程序还是有更好的方法?
我正在尝试使用VBA将数据从一个工作簿复制到我当前的工作簿.InputBook是一个工作簿对象,指的是我想从中提取数据的文件.主要问题与引用InputBook工作簿中的特定工作表有关.在InputBook中,我有一个名为"Lines"的工作表,其代号为LINES.我更愿意通过其代号引用此工作表,例如:
NumItems = WorksheetFunction.CountA(InputBook.LINES.Columns(1))
Run Code Online (Sandbox Code Playgroud)
这显然不起作用,我知道我可以通过使用以下任一方法使其功能:
NumItems = WorksheetFunction.CountA(InputBook.Sheets("Lines").Columns(1))
NumItems = WorksheetFunction.CountA(InputBook.Sheets(2).Columns(1))
Run Code Online (Sandbox Code Playgroud)
但是,我宁愿不使用这些方法中的任何一种,因为它们看起来不那么健壮.有没有办法在另一个打开的工作簿中引用工作表对象的代号?谢谢.
我的目标是创建一个行为与 Pandas DataFrame 相同的对象,但在它之上有一些我自己的额外方法。据我了解,一种方法是扩展类,我首先尝试按如下方式进行:
class CustomDF(pd.DataFrame):
def __init__(self, filename):
self = pd.read_csv(filename)
Run Code Online (Sandbox Code Playgroud)
但是在尝试查看此对象时出现错误,说:'CustomDF' object has no attribute '_data'.
我的第二次迭代不是继承对象,而是将其作为 DataFrame 导入对象属性之一,并让方法解决它,如下所示:
class CustomDF():
def __init__(self, filename):
self.df = pd.read_csv(filename)
def custom_method_1(self,a,b,...):
...
def custom_method_2(self,a,b,...):
...
Run Code Online (Sandbox Code Playgroud)
这很好,除了对于所有自定义方法,我需要首先访问该self.df属性才能对其进行任何操作,但我更希望我的自定义数据框只是self.
有没有办法做到这一点?还是这种方法并不理想?
我有一个包含多个UserForms的excel文件.要打开UserForm我有代码,如
Sub runAdjuster()
Adjuster.Show
End Sub
Run Code Online (Sandbox Code Playgroud)
其中大约有5个.在保留此代码的位置方面,什么是最佳实践?我最初在一个模块中使用它,但已决定将其移动到ThisWorkbook对象.寻找通常用于保持代码清洁的提示.
我有一个场景,我想通过将另一个较小的表合并到数据帧的每一行来扩展数据帧。
换句话说,如果较大的表是 10 行,而小表是 2 行,那么结果将是一个长度为 20 的表,其中原始表中的每一行都被复制,并且较小表中的新列被合并。
为了实现这一点,我编写了一个小函数,将一个公共列添加到每个表中,合并该列,然后删除该列。
def merge_expand(big, small):
placeholder = "__placeholderstring__"
big.insert(0, placeholder, 1)
small.insert(0, placeholder, 1)
merged = big.merge(small, how='left', on=placeholder)
merged.drop(columns=placeholder, inplace=True)
return merged
# example
big = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6]})
small = pd.DataFrame({'id': ['aa','bb'], 'val':['a','b']})
merge_expand(big, small)
# output:
a b id val
0 1 4 aa a
1 1 4 bb b
2 2 5 aa a
3 2 5 bb b
4 3 6 aa a
5 3 6 bb …Run Code Online (Sandbox Code Playgroud) 在与使用不同操作系统的人一起工作时,由于行结束,我遇到了合并冲突问题。我在 Windows 上工作,我的同事在 Mac 上工作。当他推送他的更改时,有时他没有处理过的文件会在 diff 中显示为已更改,因为现在^M每个文件上都会显示行尾。这导致了合并冲突。我在 Git 文档中阅读了以下内容:
当您将文件添加到索引时,Git 可以通过将 CRLF 行结尾自动转换为 LF 来处理此问题,反之亦然,当它检出代码到您的文件系统时。您可以使用 core.autocrlf 设置打开此功能。如果您使用的是 Windows 计算机,请将其设置为 true?—?这会在您检出代码时将 LF 结尾转换为 CRLF:
$ git config --global core.autocrlf true 如果你在使用 LF 行尾的 Linux 或 macOS 系统上,那么你不希望 Git 在检出文件时自动转换它们;但是,如果意外引入了带有 CRLF 结尾的文件,那么您可能需要 Git 修复它。您可以通过将 core.autocrlf 设置为输入来告诉 Git 在提交时将 CRLF 转换为 LF,而不是相反:
$ git config --global core.autocrlf input 这个设置应该让你在 Windows 结账中使用 CRLF 结尾,但在 macOS 和 Linux 系统以及存储库中使用 LF 结尾。
这是有道理的,但我仍然不清楚这些文件是如何在 repo 中实际提交的。例如,如果他在他的系统上创建一个文件,它会有所有的LF行结尾,对吗?因此,当他提交时,我认为这些行结尾保持原样。据我所知,当我拉动时,我的autocrlf存在true会用CRLF行尾检查它们。(我收到警告warning: …
我正在尝试将 R 中数据帧的操作管道转换为其 Python 等效项。管道的一个基本示例如下,包含一些mutate和filter调用:
library(tidyverse)
calc_circle_area <- function(diam) pi / 4 * diam^2
calc_cylinder_vol <- function(area, length) area * length
raw_data <- tibble(cylinder_name=c('a', 'b', 'c'), length=c(3, 5, 9), diam=c(1, 2, 4))
new_table <- raw_data %>%
mutate(area = calc_circle_area(diam)) %>%
mutate(vol = calc_cylinder_vol(area, length)) %>%
mutate(is_small_vol = vol < 100) %>%
filter(is_small_vol)
Run Code Online (Sandbox Code Playgroud)
我可以在熊猫复制这个没有太多的麻烦,但发现它涉及到一些嵌套lambda使用时调用assign做一个apply(第一,其中数据帧来电者是一个参数,随后与数据框行作为参数)。这往往会掩盖赋值调用的含义,如果可能的话,我想在其中指定更切题的内容(如 R 版本)。
import pandas as pd
import math
calc_circle_area = lambda diam: math.pi / 4 * diam**2 …Run Code Online (Sandbox Code Playgroud) 我有一个函数用于返回一个由单列数据列表创建的数组.我一直使用这个函数的返回值作为一个伪全局变量(LINENAMES_ARRAY),我传递给许多函数.这些函数比检查它If Len(Join(LINENAMES_ARRAY)) = 0 Then或者通过带有For Each语句的项目进行检查.这是代码:
Function LINENAMES_ARRAY() As Variant
'returns an array of all items in the main sheet linenames column
LINENAMES_ARRAY = Application.Transpose(MAIN.Range( _
MAIN.Cells(MAIN_HEAD_COUNT + 1, MAIN_LINENAMES_COLUMN), _
MAIN.Cells(LINENAMES_COUNT + 1, MAIN_LINENAMES_COLUMN)))
End Function
Run Code Online (Sandbox Code Playgroud)
我最近偶然发现了其中一个你看不到它直到你看到它的问题,同时将这个工作簿用于一个新项目,如果数组恰好只有1个元素,那么一切都会失败.显然在这种情况下,这会返回一个值,因此Join()也会失败For Each __ in LINENAMES_ARRAY.为什么不将它视为1x1数组而不是自由值?我已经开始通过重写调用它的函数来缓解这个问题,检查它是否是一个数组,然后再做一些其他的过程.像:
For j = 1 To LINENAMES_COUNT
LINES_BOX.AddItem lineNames(j)
Next j
Run Code Online (Sandbox Code Playgroud)
改为:
If Not IsArray(LINENAMES_ARRAY) Then
myListBox.AddItem CStr(LINENAMES_ARRAY)
Else
For j = 1 To LINENAMES_COUNT
LINES_BOX.AddItem LINENAMES_ARRAY(j)
Next j …Run Code Online (Sandbox Code Playgroud) 我正在尝试返回特定位置中所有文件和子文件夹的列表。我的代码如下:
from pathlib import Path
FOLDER_PATH = Path(r'C:\long\file\path\of\138\characters\')
Run Code Online (Sandbox Code Playgroud)
我收到错误:
FileNotFoundError: [WinError 3] The system cannot find the path specified:
错误发生在文件夹路径上,而不是文件上,所以我不确定这是否可能是原因。
当我手动进入文件夹并尝试在其中打开文件夹时PDF,我收到“打开此文档时出错。找不到此文件。”
同样,当我尝试打开XLSX文件时,我得到“无法访问此文件。尝试以下操作之一:(确保它存在,不是只读的,不超过 218 个字符等)”
此文件夹中的文件路径肯定超过 218 个字符,我知道这可能是 Excel 的问题,但我不明白为什么pathlib.Path.rglob列出它们会有问题,有人理解吗?
但是,如果我使用CMD( dir /s /b > files.txt) 我可以得到列表。
此外,如果我随后在 python 中导入对象files.txt列表 ,并尝试执行,它将无法将某些较长的路径正确识别为文件。Pathpaths[x.is_file() for x in paths]
我已经验证,如果我在本地复制目录(其中存在更短的路径),则 Excel 和pathlib.Path.rglob.
可以做些什么来解决这个问题,为什么它首先是一个问题?
我无法将值从一个工作簿范围分配到当前工作簿中的范围.当我使用Range("A1:C1")分配我的范围时,此代码可以正常工作,但是当使用Range(Cells(1,1),Cells(1,3))定义我的范围时,该函数将失败:
Sub CopyRange()
Dim inputExcel As Excel.Application, BookA As Workbook
Path_A = ThisWorkbook.Path & "\Book_A.xlsx"
Set inputExcel = New Excel.Application
Set BookA = inputExcel.Workbooks.Open(Path_A, ReadOnly:=True)
'THIS WORKS:
ThisWorkbook.Sheets(1).Range("A1:C1").Value = _
BookA.Sheets(1).Range("A1:C1").Value
'THIS DOESN'T WORK:
ThisWorkbook.Sheets(1).Range(Cells(1, 1), Cells(1, 3)).Value = _
BookA.Sheets(1).Range(Cells(1, 1), Cells(1, 3)).Value
End Sub
Run Code Online (Sandbox Code Playgroud)
我知道这必须是一个简单的语法问题,但我无法弄明白.如何使用"单元格"工作来获取范围分配?
我试图通过将我的列表框对象传递给子函数来填充列表框,但每当我运行它时,我都会遇到类型不匹配错误.我将对象MAIN.BoxY1传递给函数FillListBox,其中MAIN是列表框所在的工作表的代号,BoxY1是我的列表框名称(ActiveX).当我改变FillListBox函数以包含MAIN.BoxY1而不是每个实例的MyBox时,它将正常工作.将列表框传递给另一个函数的正确方法是什么?
Sub FillListBox(MyBox As ListBox, DataList As Variant)
MyBox.MultiSelect = 1
For j = 1 To NumOutputs
MyBox.AddItem DataList(j)
Next j
End Sub
Sub BoxY1_Fill()
FillListBox MAIN.BoxY1, TheData
End Sub
Run Code Online (Sandbox Code Playgroud)
我当前的项目具有全局常量,用于定义此项目将搜索的工作簿中的某些行和列.我已经将它们定义为:
Public Const headRow As Integer = 1
Public Const descRow As Integer = 2
Public Const pnumCol As Integer = 1
Public Const teamCol As Integer = 2
Public Const dateCol As Integer = 3
Public Const hourCol As Integer = 4
Public Const typeCol As Integer = 5
Public Const taskCol As Integer = 6
Public Const noteCol As Integer = 7
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更清晰的方法来定义这些,这将允许我以这样的方式写这些:
ColumnNums.team
ColumnNums.task
ColumnNums.note 'etc
Run Code Online (Sandbox Code Playgroud)
我认为可以通过定义我自己的类型来完成与此相似的事情,但这可能不值得.我基本上希望这是一个简单的方法来记住变量名称,因为我编写了更多代码,以及能够计算每组中有多少项目.在这种情况下,类型或集合是否有用?
我正在运行一个userform,它应该运行一个exe文件,在工作文件夹中找到,如下所示:
Sub RunProcessor()
If MsgBox("Run simulation?", vbYesNo) = vbNo Then
Exit Sub
Else
ChDir ThisWorkbook.Path
Shell ("runsims.exe")
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
这在我的本地驱动器上工作正常,但是当我将所有内容移动到服务器驱动器时(Shell函数调用行上的运行时错误5),它开始失败.
我知道在cmd中,当你在C:盘上工作并cd L:\...\...\打电话时,你也需要输入L:,所以我试着将这行代码插入到另一个Shell调用之上:Shell (Left(ThisWorkbook.Path, 2))但是这也失败了.我怎么能运行"runsims.exe",因为它总是在当前的工作驱动器中?