首页
关于
Search
1
怎么快速从GitHub上下载代码
48 阅读
2
GitHub下载加速的有效方法
39 阅读
3
Python中的center()是怎么用的
35 阅读
4
如何在GitHub上下载旧版本
34 阅读
5
怎样删除GitHub存储库
32 阅读
Python
Github
IDC推荐
登录
Search
Xbe
累计撰写
242
篇文章
累计收到
1
条评论
首页
栏目
Python
Github
IDC推荐
页面
关于
搜索到
76
篇与
的结果
2025-03-04
python的sort()排序方法
很多时候我们的需要排序,例如下面这个情况:l = [[2, 3], [6, 7], [3, 34], [24, 64], [1, 43]]可能我们需要按按照没个元素的第一个数值的大小进行排序如果第I个元素是I ,我们希望通过I[0]进行排序解决办法是:先定义一个方法,这个方法就是来返回第一个数的,比如,我们传递第一个元素过去[2,3],我们得到的是=>2def getKey(item): return item[0]然后,我们使用强大的sort()函数sorted(l, key=getKey)然后,我们就得到我们想要的了…..[[1, 43], [2, 3], [3, 34], [6, 7], [24, 64]]——————————————————————-再来一个: B={ "name": "c", "age": 22, "tel": 711749632 }, { "name": "a", "age": 22, "tel": 586665984 }, { "name": "b", "age": 5, "tel": 303493120 }, { "name": "e", "age": 6, "tel": 1412341760 }现在我们想按照name进行排序 B2 = sorted(B,key = lambda x:x['name'])一样这个是一个比较简单的写法,我们当然可以先顶一个函数def getName(s): return s['name'] 然后B3 = sorted(B,key=getName)结果一样
2025年03月04日
7 阅读
0 评论
0 点赞
2025-03-04
Python中的文件读写
Python处理两种不同类型的文件:二进制文件和文本文件。了解两者之间的差异很重要,因为它们的处理方式不同。二进制文件在正常计算机使用期间使用的大多数文件实际上是二进制文件,而不是文本。比如:Microsoft Word .doc文件实际上是一个二进制文件,即使它只有文本。二进制文件的其他示例包括:图像文件,包括.jpg,.png,.bmp,.gif,等。数据库文件包括.mdb,.frm和.sqlite文件,包括.doc,.xls,.pdf或者其他文件。那是因为这些文件都有特殊处理的要求,需要特定类型的软件来打开它。例如,您需要Excel来打开.xls文件,并使用数据库程序来打开.sqlite文件。文本文件一方面,没有特定的编码,可以通过没有任何特殊处理的标准文本编辑器打开。但是,每个文本文件都必须遵守一组规则:文本文件必须是可读的。他们可以(并且经常会)包含许多特殊编码,尤其是在HTML或其他标记语言中,但您仍然可以说出它的含义文本文件中的数据按行组织。在大多数情况下,每一行都是一个独特的元素,无论是指令行还是命令。此外,文本文件在每行的末尾都有一个看不见的字符,这使文本编辑器知道应该有一个新行。通过编程与这些文件交互时,您可以利用该字符。在Python中,它用“ \n” 表示。在哪里可以找到Python的文件I / O工具在Python中工作时,您不必担心导入任何特定的外部库来处理文件。Python附带有“文件库”,文件I / O工具和实用程序是核心语言的内置部分。但是在其他语言(如C ++)中,要处理文件,您必须通过包含正确的头文件来启用文件I / O工具#include <fstream>。如果您使用Java编写代码,则需要使用该import java.io.*语句。使用Python,就没有必要这样做,这是因为Python有一组内置函数,可以处理读取和写入文件所需的所有内容。
2025年03月04日
2 阅读
0 评论
0 点赞
2025-03-02
Python中的文件读写
Python中的文件读写-实际操作用Python打开文件你需要知道的第一个功能是open()。在Python 2和Python 3中,此命令将返回参数中指定的文件对象。基本功能用法open()如下:file_object = open(filename, mode)在此实例中,filename是您要与之交互的文件的名称,包含文件扩展名。也就是说,如果你有一个文本文件workData.txt,你的文件名不仅仅是"workData"。是的"workData.txt"。如果您使用的是Windows,还可以指定文件所在的确切路径,例如“C:\ ThisFolder \ workData.txt”。但请记住,字符串中的单个反斜杠向Python指示字符串文字的开头。所以这里有一个问题,因为这两个含义会发生冲突......值得庆幸的是,Python有两种方法可以解决这个问题。第一种是使用双反斜杠:"C:\\ThisFolder\\workData.txt"。第二种是使用正斜杠:"C:/ThisFolder/workData.txt"。open函数中的模式告诉Python你要对文件做什么。处理文本文件时可以指定多种模式。'w'- 写入模式:当需要更改文件并更改或添加信息时,使用此模式。请记住,这会擦除现有文件以创建新文件。文件指针位于文件的开头。'r'- 读取模式:当文件中的信息仅用于读取而不以任何方式更改时,使用此模式。文件指针位于文件的开头。'a'- 附加模式:此模式自动将信息添加到文件末尾。文件指针放在文件的末尾。'r+'- 读/写模式:当您要更改文件并从中读取信息时使用。文件指针位于文件的开头。'a+'- 附加和读取模式:打开文件以允许将数据添加到文件末尾,并让程序也读取信息。文件指针放在文件的末尾。使用二进制文件时,将使用相同的模式说明符。但是,您将ab添加到最后。所以二进制文件的写模式说明符是'wb'。其余的是'rb','ab','r+b',和'a+b'分别。在Python 3中,添加了一个新模式:'x'- 独占创建模式:此模式专门用于创建文件。如果已存在同名文件,则函数调用将失败。我们来看一个如何打开文件和设置访问模式的示例。使用该open()函数时,通常会将其结果赋给变量。给定一个名为的文件workData.txt,打开文件进行读写的正确代码如下:data_file = open("workData.txt", "r+")这将创建一个名为的对象data_file,然后我们可以使用Pythons 文件对象方法进行操作。我们'r+'在这个代码示例中使用了访问模式,它告诉Python我们要打开文件进行读写。这为我们提供了很大的灵活性,但通常您可能希望将程序限制为只读取或只是写入文件,这是其他模式派上用场的地方。在Python中关闭文件在阅读和写作时,了解如何关闭文件非常重要。它释放了程序用于I / O目的的系统资源。编写具有空间或内存限制的程序时,可以有效地管理资源。此外,关闭文件可确保将任何挂起的数据写入底层存储系统,例如本地磁盘驱动器。通过显式关闭文件,您可以确保刷新内存中的任何缓冲数据并将其写入文件。在Python中关闭文件的功能很简单fileobject.close()。使用data_file我们在上一个示例中创建的文件对象,关闭它的命令将是:data_file.close()关闭文件后,在以后重新打开文件之前,您无法再访问该文件。尝试读取或写入已关闭的文件对象将引发ValueError异常:>>> f = open("/tmp/myfile.txt", "w") >>> f.close() >>> f.read()Traceback (most recent call last): File "<input>", line 1, in <module> f.read()ValueError: I/O operation on closed file.在Python中,打开和关闭文件的最佳实践使用with关键字。嵌套代码块完成后,此关键字将自动关闭文件:with open("workData.txt", "r+") as workData: # File object is now open. # Do stuff with the file: workData.read() # File object is now closed. # Do other things...如果您不使用该with关键字或使用该fileobject.close()函数,那么Python将通过内置的垃圾收集器自动关闭并销毁文件对象。但是,根据您的代码,此垃圾收集可以随时进行。所以建议使用with关键字来控制何时关闭文件 - 即在内部代码块完成执行之后。使用Python文件对象成功打开文件后,可以使用内置方法处理新文件对象。您可以从中读取数据,也可以向其中写入新数据。还有其他操作,如移动“读/写指针”,它确定从中读取文件数据的位置以及写入的位置。接下来,将学习如何从打开的文件中读取数据:在Python中从文件中读取数据读取文件的内容使用该fileobject.read(size)方法。默认情况下,此方法将读取整个文件并将其作为字符串(在文本模式下)或字节对象(在二进制模式下)打印到控制台。但是,使用默认大小时必须小心。如果您正在阅读的文件大于可用内存,则无法一次访问整个文件。在这种情况下,您需要使用该size参数将其分解为内存可以处理的块。该size参数告诉read方法有多少字节进入文件返回显示。因此,我们假设我们的“workData.txt”文件中包含以下文本:This data is on line 1 This data is on line 2 This data is on line 3然后,如果您在Python 3中编写以下程序:with open("workData.txt", "r+") as work_data: print("This is the file name: ", work_data.name) line = work_data.read() print(line)你会得到这个输出:This is the file name: workData.txt This data is on line 1 This data is on line 2 This data is on line 3另一方面,如果你调整第三行说:line = workData.read(6)您将获得以下输出:This is the file name: workData.txt This d如您所见,读取操作仅读取文件中的数据到位6,这是我们传递给read()上面的调用的内容。这样,您可以一次性限制从文件中读取的数据量。如果再次从同一文件对象中读取,它将继续读取您中断的数据。这样,您就可以在几个较小的“块”中处理大型文件。逐行阅读文本文件 readline()您还可以通过逐行读取来解析文件中的数据。这可以让您逐行扫描整个文件,只在您想要的时候前进,或者让您看到特定的行。该fileobject.readline(size)方法默认返回文件的第一行。但是通过更改整数size参数,您可以获得所需文件中的任何行。例如:with open("workData.txt", "r+") as work_data: print("This is the file name: ", work_data.name) line_data = work_data.readline() print(line_data)这将返回以下输出:This is the file name: workData.txt This data is on line 1将a 2或a 3作为size变量将相应地返回第二行或第三行。类似的方法是fileobject.readlines()调用(注意复数),它以元组格式返回每一行。如果您打电话:print(work_data.readlines())您将获得以下输出:['This data is on line 1', 'This data is on line 2', 'This data is on line 3']如您所见,这会将整个文件读入内存并将其拆分为多行。但这仅适用于文本文件。二进制文件只是一个数据块 - 它实际上并不具有单行的概念。逐行处理整个文本文件在Python中逐行处理整个文本文件的最简单方法是使用一个简单的循环:with open("workData.txt", "r+") as work_data: for line in work_data: print(line)这有以下输出:This data is on line 1 This data is on line 2 This data is on line 3这种方法非常节省内存,因为我们将单独读取和处理每一行。这意味着我们的程序永远不需要立即将整个文件读入内存。因此,使用readline()是一种以较小的块处理大文本文件的舒适且有效的方式。使用Python写入文件到Python write()如果您无法向他们写入数据,那么文件就不会有任何好处。请记住,当您创建新文件对象时,如果文件尚不存在,Python将创建该文件。首次创建文件时,您应该使用a+或w+模式。通常最好使用该a+模式,因为数据将默认添加到文件的末尾。使用w+将清除文件中的任何现有数据,并为您提供“空白”。在Python中写入文件的默认方法是使用fileobject.write(data)。例如,您可以使用以下代码在我们的“workData.txt”文件中添加一个新行:work_data.write("This data is on line 4\n")的\n充当新行指示,移动后续写入到下一行。如果要将不是字符串的内容写入文本文件(例如一系列数字),则必须使用转换代码将它们转换或“转换”为字符串。例如,如果要将整数1234,5678,9012添加到work_data文件中,则执行以下操作。首先,将非字符串转换为字符串,然后将该字符串写入文件对象:values = [1234, 5678, 9012]with open("workData.txt", "a+") as work_data: for value in values: str_value = str(value) work_data.write(str_value) work_data.write("\n")文件搜索:移动读/写指针请记住,使用a+模式编写时,文件指针始终位于文件末尾。因此,在我们编写两个数字的情况下使用上面的代码,如果你使用这个fileobject.write()方法,你就不会得到任何回报。那是因为该方法正在寻找指向其他文本的指针。那么你需要做的是将指针移回文件的开头。最简单的方法是使用该fileobject.seek(offset, from_what)方法。在此方法中,您将指针放在特定位置。偏移量是from_what参数中的字符数。该from_what参数有三个可能的值:0 - 表示文件的开头1 - 表示当前指针位置2 - 表示文件的结尾当您使用文本文件(那些在模式下没有使用ab打开的文件)时,您只能使用默认值0或a seek(0, 2),它将带您到文件的末尾。因此,通过work_data.seek(3, 0)在我们的“workData.txt”文件中使用,您将指针放在第4个字符处(请记住,Python开始计数为0)。如果使用行打印循环,则会得到以下输出:s data is on line 1 This data is on line 2 This data is on line 3如果要检查指针的当前位置,可以使用该fileobject.tell()方法,该方法返回当前文件中指针所在位置的十进制值。如果我们想查找当前work_data文件的时长,我们可以使用以下代码:with open("workData.txt", "a+") as work_data: print(work_data.tell())这将返回69,这是文件的大小。使用Python编辑现有文本文件您需要编辑现有文件而不是仅向其附加数据。你不能只使用w+模式来做到这一点。请记住,该模式w将完全覆盖该文件,因此即使使用fileobject.seek(),您也无法执行此操作。而且a+总是在文件的末尾插入任何数据。最简单的方法是将整个文件拉出来并使用它创建列表或数组数据类型。创建列表后,您可以使用该list.insert(i, x)方法插入新数据。创建新列表后,您可以将其重新连接在一起并将其写回文件。请记住,对于list.insert(i, x),i是一个整数,表示细胞数。然后将x的数据放在指示的列表中的单元格之前i。例如,使用我们的“workData.txt”文件,假设我们需要在第一行和第二行之间插入文本行“这在第1行和第2行之间”。这样做的代码是:# Open the file as read-only with open("workData.txt", "r") as work_data: work_data_contents = work_data.readlines() work_data_contents.insert(1, "This goes between line 1 and 2\n") # Re-open in write-only format to overwrite old file with open("workData.txt", "w") as work_data: work_dataContents = "".join(work_data_contents) work_data.write(work_data_contents)运行此代码后,如果执行以下操作:with open("workData.txt", "r") as work_data: for line in work_data: print(line)你会得到一个输出:This data is on line 1 This goes between line 1 and 2 This data is on line 2 This data is on line 3现在就演示了如何在Python中编辑现有的文本文件,在您想要的位置插入新的文本行。
2025年03月02日
7 阅读
0 评论
0 点赞
2025-03-02
Python使用Pillow添加图片水印
如果在某个网站上发布了图片,希望在图片上会出现带标识的水印着怎么办呢。这个是个比较常见的需求,在Python中应该如何处理这一类需求呢?需要先安装Pillow: pip install pillowDemo代码:import sys from PIL import Image, ImageDraw, ImageFont def watermark_with_text(file_obj, text, color, fontfamily=None): image = Image.open(file_obj).convert('RGBA') draw = ImageDraw.Draw(image) width, height = image.size margin = 10 if fontfamily: font = ImageFont.truetype(fontfamily, int(height / 20)) else: font = None textWidth, textHeight = draw.textsize(text, font) x = (width - textWidth - margin) / 2 # 计算横轴位置 y = height - textHeight - margin # 计算纵轴位置 draw.text((x, y), text, color, font) return image if __name__ == '__main__': org_file = sys.argv[1] with open(org_file, 'rb') as f: image_with_watermark = watermark_with_text(f, 'py.com', 'red') with open('new_image_water.png', 'wb') as f: image_with_watermark.save(f)使用方法: python watermart.py <图片地址>这个只是把文本嵌入到图片中的实现,其实也可以嵌入一个图片进去的。具体可以参考pillow官方文档:https://pillow.readthedocs.io/en/3.1.x/reference/Image.html#PIL.Image.alpha_composite
2025年03月02日
8 阅读
0 评论
0 点赞
2025-03-02
Python中对切片赋值原理分析
有这么个问题::t = [1, 2, 3] t[1:1] = [7] print t # 输出 [1, 7, 2, 3]谁会对列表这么进行赋值呢?但是对于这个输出结果的原因确实值得去再了解下,今天看看Python的源码,了解下原理是什么。注:本地下载的是Python2.7.6的代码,直接看这个。在Objects/listobject.c中有一个 PyList_SetSlice 函数,是这么写的::int PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v) { if (!PyList_Check(a)) { PyErr_BadInternalCall(); return -1; } return list_ass_slice((PyListObject *)a, ilow, ihigh, v); }有用的一句就是 list_ass_slice ,那么再来看看这个函数的代码::static int list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v) { /* Because [X]DECREF can recursively invoke list operations on this list, we must postpone all [X]DECREF activity until after the list is back in its canonical shape. Therefore we must allocate an additional array, 'recycle', into which we temporarily copy the items that are deleted from the list. :-( */ PyObject *recycle_on_stack[8]; PyObject **recycle = recycle_on_stack; /* will allocate more if needed */ PyObject **item; PyObject **vitem = NULL; PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */ Py_ssize_t n; /* # of elements in replacement list */ Py_ssize_t norig; /* # of elements in list getting replaced */ Py_ssize_t d; /* Change in size */ Py_ssize_t k; size_t s; int result = -1; /* guilty until proved innocent */ #define b ((PyListObject *)v) if (v == NULL) n = 0; else { if (a == b) { /* Special case "a[i:j] = a" -- copy b first */ v = list_slice(b, 0, Py_SIZE(b)); if (v == NULL) return result; result = list_ass_slice(a, ilow, ihigh, v); Py_DECREF(v); return result; } v_as_SF = PySequence_Fast(v, "can only assign an iterable"); if(v_as_SF == NULL) goto Error; /* 要赋值的长度n */ n = PySequence_Fast_GET_SIZE(v_as_SF); vitem = PySequence_Fast_ITEMS(v_as_SF); } if (ilow < 0) ilow = 0; else if (ilow > Py_SIZE(a)) ilow = Py_SIZE(a); if (ihigh < ilow) ihigh = ilow; else if (ihigh > Py_SIZE(a)) ihigh = Py_SIZE(a); norig = ihigh - ilow; assert(norig >= 0); d = n - norig; if (Py_SIZE(a) + d == 0) { Py_XDECREF(v_as_SF); return list_clear(a); } item = a->ob_item; /* recycle the items that we are about to remove */ s = norig * sizeof(PyObject *); if (s > sizeof(recycle_on_stack)) { recycle = (PyObject **)PyMem_MALLOC(s); if (recycle == NULL) { PyErr_NoMemory(); goto Error; } } memcpy(recycle, &item[ilow], s); if (d < 0) { /* Delete -d items */ memmove(&item[ihigh+d], &item[ihigh], (Py_SIZE(a) - ihigh)*sizeof(PyObject *)); list_resize(a, Py_SIZE(a) + d); item = a->ob_item; } else if (d > 0) { /* Insert d items */ k = Py_SIZE(a); if (list_resize(a, k+d) < 0) goto Error; item = a->ob_item; printf("关键点\n"); /* 把list对应切片后一位的值之后的所有内容向后移动所赋值的大小 按照上面的python代码这里就是 原理的t: |1|2|3| 后移一位,因为len([7]) = 1 |1|空|2|3|把后两个移位 */ memmove(&item[ihigh+d], &item[ihigh], (k - ihigh)*sizeof(PyObject *)); } /* 赋值操作,即把[7]赋值到t里的对应位置上 ilow是1, n是1 */ for (k = 0; k < n; k++, ilow++) { PyObject *w = vitem[k]; Py_XINCREF(w); item[ilow] = w; } for (k = norig - 1; k >= 0; --k) Py_XDECREF(recycle[k]); result = 0; Error: if (recycle != recycle_on_stack) PyMem_FREE(recycle); Py_XDECREF(v_as_SF); return result; #undef b }源码内有详细注释,编程问题的研究最好的解释还是源码。
2025年03月02日
7 阅读
0 评论
0 点赞
1
...
11
12
13
...
16