reportlab 生成pdf文件 (python)

1 安装

pip install reportlab

2 应用场景

  • 通过网页动态生成PDF文档
  • 大量的报告和数据发布
  • 用XML一步生成PDF
    官网案例

3 PLATYPUS

Platypus是“Page Layout and Typography Using Scripts”,是使用脚本的页面布局和印刷术的缩写,这是一个高层次页面布局库,它可以让你通过编程创造复杂的文档,并且毫不费力。

Platypus设计的目的是尽可能地将高层布局设计与文档内容分离,比如,段落使用段落格式构造,页面使用页面模板,这样做是有好处的,在仅仅修改几行代码的情况下,包含数百个页面的数百个文档就能够被构造成不同的风格。

  • Platypus从上到下,可以被看成具备多个层次。
  • DocTemplates:文档最外层的容器
  • PageTemplates:各种页面布局的规格
  • Frames:包含流动的文本和图形的文档区域规范
  • Flowables:能够被“流入文档”的文本、图形和段落等。
    在这里插入图片描述

3.1 start demo

import reportlab
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.lib.styles import getSampleStyleSheet

# 调用模板,创建指定名称的PDF文档
doc = SimpleDocTemplate("start_demo.pdf")
# 获得模板表格
styles = getSampleStyleSheet()
# 指定模板
style = styles['Normal']
# 初始化内容
story =[]
# 将段落添加到内容中
story.append(Paragraph("this is a demo pdf!",style))
# 将内容输出到PDF中
doc.build(story)

在Python文件的同目录下,生成一个文件名为”start_demo.pdf“的文件:
在这里插入图片描述

doc = SimpleDocTemplate("start_demo.pdf") 调用了 BaseDocTemplate模板

BaseDocTemplate 基本思想很简单。
1) 该文档有一个与之相关的数据列表,这些数据应该来自流动性。我们会特殊类,如PageBreak、FrameBreak,用于执行强制页面结束等操作。
2) 文档有一个或多个页面模板。
3) 每个页面模板都有一个或多个框架。
4) document类提供了处理故事事件的基本方法,以及将故事流放入框架的一些合理方法。
5) 文档实例可以覆盖基本处理程序例程。
这个类的大多数方法不是由用户直接调用的,但在一些高级用法中,它们可能需要通过子类化来重写。
异常:必须调用doctemplate.build(…)才能获得最合理的用途,因为它使用页面模板生成文档。
每个文档模板在初始化时将恰好一个文档构建到filename参数指定的文件中。
初始化的可能关键字参数:
-pageTemplates:模板列表。必须是非空的。指定给模板的名称用于引用它们,因此使用的两个模板不应具有相同的名称。例如,在奇数页和偶数页上,您可能需要一个标题页模板、一个章节首页模板、一章首页模板和两个章节内部模板。如果省略了此参数,则在生成文档之前,应使用addPageTemplates方法至少提供一个pageTemplate。
-pageSize:reportlab/lib/pagesizes.pu中的2元组或大小常量。由SimpleDocTemplate子类使用,该子类不接受的列表
pageTemplates,但为您制作一个;使用pageTemplates时忽略。
-showBoundary:如果设置,则在框架边界周围绘制一个框。
-左边距:
-右侧边距:
-顶部边距:
-底部边距:以点为单位的边距大小(默认为1英寸)。这些页边距可能会被pageTemplates覆盖。它们主要是SimpleDocumentTemplate子类感兴趣的。
-allowSpliting:如果设置了流动性(如段落),则可以在框架或页面之间进行拆分(默认值:1-title:文档的内部标题(不会自动显示在任何页面上)
-author:文档的内部作者(不会自动显示在任何页面上)

初始化参数:
      'pagesize':defaultPageSize,
      'pageTemplates':[],
      'showBoundary':0,
      'leftMargin':inch,
      'rightMargin':inch,
      'topMargin':inch,
      'bottomMargin':inch,
      'allowSplitting':1,
      'title':None,
      'author':None,
      'subject':None,
      'creator':None,
      'producer':None,
      'keywords':[],
      'invariant':None,
      'pageCompression':None,
      '_pageBreakQuick':1,
      'rotation':0,
      '_debug':0,
      'encrypt': None,
      'cropMarks': None,
      'enforceColorSpace': None,
      'displayDocTitle': None,
      'lang': None,
      'initialFontName': None,
      'initialFontSize': None,
      'initialLeading': None,
      'cropBox': None,
      'artBox': None,
      'trimBox': None,
      'bleedBox': None,
      'keepTogetherClass': KeepTogether,
      'hideToolbar': None,
      'hideMenubar': None,
      'hideWindowUI': None,
      'fitWindow': None,
      'centerWindow': None,
      'nonFullScreenPageMode': None,
      'direction': None,
      'viewArea': None,
      'viewClip': None,
      'printArea': None,
      'printClip': None,
      'printScaling': None,
      'duplex': None,

4 段落

段落是一种重要的Flowables,它可以格式化任意的文本。

段落中主要包括两种信息:文本和格式。Paragraph(text, style)

  • text参数提供了段落的文本,末尾和换行处的空白都会被删除。
  • style参数用于设置段落的格式,这里段落的格式是指参数的集合,包括字体大小、行间距、首行缩进等参数。我们可以调用如下语句来获得默认段落格式。
from reportlab.lib.styles import ParagraphStyle

4.1 ParagraphStyle 参数

class ParagraphStyle(PropertySet):
    defaults = {
        'fontName':_baseFontName,
        'fontSize':10,
        'leading':12,
        'leftIndent':0,
        'rightIndent':0,
        'firstLineIndent':0,
        'alignment':TA_LEFT,
        'spaceBefore':0,
        'spaceAfter':0,
        'bulletFontName':_baseFontName,
        'bulletFontSize':10,
        'bulletIndent':0,
        #'bulletColor':black,
        'textColor': black,
        'backColor':None,
        'wordWrap':None,        #None means do nothing special
                                #CJK use Chinese Line breaking
                                #LTR RTL use left to right / right to left
                                #with support from pyfribi2 if available
        'borderWidth': 0,
        'borderPadding': 0,
        'borderColor': None,
        'borderRadius': None,
        'allowWidows': 1,
        'allowOrphans': 0,
        'textTransform':None,   #uppercase lowercase (captitalize not yet) or None or absent
        'endDots':None,         #dots on the last line of left/right justified paras
                                #string or object with text and optional fontName, fontSize, textColor & backColor
                                #dy
        'splitLongWords':1,     #make best efforts to split long words
        'underlineWidth': _baseUnderlineWidth,  #underline width default
        'bulletAnchor': 'start',    #where the bullet is anchored ie start, middle, end or numeric
        'justifyLastLine': 0,   #n allow justification on the last line for more than n words 0 means don't bother
        'justifyBreaks': 0,     #justify lines broken with <br/>
        'spaceShrinkage': _spaceShrinkage,  #allow shrinkage of percentage of space to fit on line
        'strikeWidth': _baseStrikeWidth,    #stroke width default
        'underlineOffset': _baseUnderlineOffset,    #fraction of fontsize to offset underlines
        'underlineGap': _baseUnderlineGap,      #gap for double/triple underline
        'strikeOffset': _baseStrikeOffset,  #fraction of fontsize to offset strikethrough
        'strikeGap': _baseStrikeGap,        #gap for double/triple strike
        'linkUnderline': _platypus_link_underline,
        'underlineColor':   None,
        'strikeColor': None,
        'hyphenationLang': _hyphenationLang,
        #'hyphenationMinWordLength': _hyphenationMinWordLength,
        'embeddedHyphenation': _embeddedHyphenation,
        'uriWasteReduce': _uriWasteReduce,
        }

几个重要的参数说明:

  • fontName:字体名称
  • fontSize:字体大小
  • leading:行间距
  • leftIndent:左缩进
  • rightIndent:右缩进
  • firstLineIndent:首行缩进
  • alignment:对齐方式
  • spaceBefore:段前间隙
  • spaceAfter:段后间隙
  • bulletFontName:列表名称
  • bulletFontSize:列表字体大小
  • bulletIndent:列表缩进
  • textColor:字体颜色
  • backColor:背景色
  • borderWidth:边框粗细
  • borderPadding:边框间距
  • borderColor:边框颜色

ParagraphStyle是段落的默认格式,也就是在调用Paragraph(text, style)语句时,如果不传入style参数,默认的段落格式。

还有其他方式获得ReportLab提供的段落格式:

from reportlab.lib.styles import getSampleStyleSheet
stylesheet=getSampleStyleSheet()
normalStyle = stylesheet['Normal']

这里获得系统提供的Normal格式,其实Normal格式与ParagraphStyle是一模一样的,除了Normal格式,还可以获得其他的格式:

  • Normal
  • BodyText
  • Italic
  • Title
  • Heading1
  • Heading2
  • Heading3
  • Heading4
  • Heading5
  • Heading6
  • Bullet
  • Definition
  • Code
  • UnorderedList
  • OrderedList
def getSampleStyleSheet():
    """Returns a stylesheet object"""
    stylesheet = StyleSheet1()

    stylesheet.add(ParagraphStyle(name='Normal',
                                  fontName=_baseFontName,
                                  fontSize=10,
                                  leading=12)
                   )

    stylesheet.add(ParagraphStyle(name='BodyText',
                                  parent=stylesheet['Normal'],
                                  spaceBefore=6)
                   )
    stylesheet.add(ParagraphStyle(name='Italic',
                                  parent=stylesheet['BodyText'],
                                  fontName = _baseFontNameI)
                   )

    stylesheet.add(ParagraphStyle(name='Heading1',
                                  parent=stylesheet['Normal'],
                                  fontName = _baseFontNameB,
                                  fontSize=18,
                                  leading=22,
                                  spaceAfter=6),
                   alias='h1')

    stylesheet.add(ParagraphStyle(name='Title',
                                  parent=stylesheet['Normal'],
                                  fontName = _baseFontNameB,
                                  fontSize=18,
                                  leading=22,
                                  alignment=TA_CENTER,
                                  spaceAfter=6),
                   alias='title')

    stylesheet.add(ParagraphStyle(name='Heading2',
                                  parent=stylesheet['Normal'],
                                  fontName = _baseFontNameB,
                                  fontSize=14,
                                  leading=18,
                                  spaceBefore=12,
                                  spaceAfter=6),
                   alias='h2')

    stylesheet.add(ParagraphStyle(name='Heading3',
                                  parent=stylesheet['Normal'],
                                  fontName = _baseFontNameBI,
                                  fontSize=12,
                                  leading=14,
                                  spaceBefore=12,
                                  spaceAfter=6),
                   alias='h3')

    stylesheet.add(ParagraphStyle(name='Heading4',
                                  parent=stylesheet['Normal'],
                                  fontName = _baseFontNameBI,
                                  fontSize=10,
                                  leading=12,
                                  spaceBefore=10,
                                  spaceAfter=4),
                   alias='h4')

    stylesheet.add(ParagraphStyle(name='Heading5',
                                  parent=stylesheet['Normal'],
                                  fontName = _baseFontNameB,
                                  fontSize=9,
                                  leading=10.8,
                                  spaceBefore=8,
                                  spaceAfter=4),
                   alias='h5')

    stylesheet.add(ParagraphStyle(name='Heading6',
                                  parent=stylesheet['Normal'],
                                  fontName = _baseFontNameB,
                                  fontSize=7,
                                  leading=8.4,
                                  spaceBefore=6,
                                  spaceAfter=2),
                   alias='h6')

    stylesheet.add(ParagraphStyle(name='Bullet',
                                  parent=stylesheet['Normal'],
                                  firstLineIndent=0,
                                  spaceBefore=3),
                   alias='bu')

    stylesheet.add(ParagraphStyle(name='Definition',
                                  parent=stylesheet['Normal'],
                                  firstLineIndent=0,
                                  leftIndent=36,
                                  bulletIndent=0,
                                  spaceBefore=6,
                                  bulletFontName=_baseFontNameBI),
                   alias='df')

    stylesheet.add(ParagraphStyle(name='Code',
                                  parent=stylesheet['Normal'],
                                  fontName='Courier',
                                  fontSize=8,
                                  leading=8.8,
                                  firstLineIndent=0,
                                  leftIndent=36,
                                  hyphenationLang=''))

    stylesheet.add(ListStyle(name='UnorderedList',
                                parent=None,
                                leftIndent=18,
                                rightIndent=0,
                                bulletAlign='left',
                                bulletType='1',
                                bulletColor=black,
                                bulletFontName='Helvetica',
                                bulletFontSize=12,
                                bulletOffsetY=0,
                                bulletDedent='auto',
                                bulletDir='ltr',
                                bulletFormat=None,
                                #start='circle square blackstar sparkle disc diamond'.split(),
                                start=None,
                            ),
                   alias='ul')

    stylesheet.add(ListStyle(name='OrderedList',
                                parent=None,
                                leftIndent=18,
                                rightIndent=0,
                                bulletAlign='left',
                                bulletType='1',
                                bulletColor=black,
                                bulletFontName='Helvetica',
                                bulletFontSize=12,
                                bulletOffsetY=0,
                                bulletDedent='auto',
                                bulletDir='ltr',
                                bulletFormat=None,
                                #start='1 a A i I'.split(),
                                start=None,
                            ),
                   alias='ol')
    return stylesheet

假如想要获得Title格式,我们只需要按照如下格式调用即可:

from reportlab.lib.styles import getSampleStyleSheet
stylesheet=getSampleStyleSheet()
titleStyle = stylesheet['Title']

从Title的源代码可知:Title的效果是:字体18号;行间距22;对齐方式:居中;段落后间距:6。

5 表格

表格是Flowable的派生类,是一种简单文本表格机制。表格可以保存所有能被转换为字符串或Flowerable是所有事物。
如果我们不提供行高,它们可以根据数据自动计算出行高。
如果需要,它们可以跨页分割,你可以指定跨页分割后,需要重复的行数。
表格风格和表格数据是分离的,因此你可以声明一系列的风格,然后将它们用于一大堆报告。
表格使用如下代码进行创建:

Table(data, colWidths=None, rowHeights=None, style=None, splitByRow=1,
repeatRows=0, repeatCols=0, rowSplitRange=None, spaceBefore=None,
spaceAfter=None)

几个关键参数:

  • data:数据参数是一系列的表格值,每个表格值能够被转换为字符串或者Flowable实例。data值的第一行是data[0],第i行j列表格值是data[i] [j]。
  • colWidths:是一系列值,这些值代表每列的宽度。如果传递的是None,则对应列宽需要被自动计算。
  • rowHeights:是一系列值,这些值代表每行的高度。如果传递的是None,则对应的行高需要被自动计算。
  • style:表格被创建时的初始样式值。
  • splitByRow:布尔值,当指定值为1时,允许跨页分割表格,当指定指为0时,不允许跨页分割表格。
  • repeatRows:指定跨页分行时,需要重复的行数。
  • repeatCols:暂时没用。
  • spaceBefore:指定表格前的行数。
  • spaceAfter:指定表格后的行数。
from reportlab.platypus import SimpleDocTemplate, Table
from reportlab.lib.styles import getSampleStyleSheet

# 调用模板,创建指定名称的PDF文档
doc = SimpleDocTemplate("my_pdf_01.pdf")
# 获得模板表格
styles = getSampleStyleSheet()
# 指定模板
style = styles['Normal']
# 初始化内容
story =[]

# 初始化表格内容
data= [['00', '01', '02', '03', '04'],
       ['10', '11', '12', '13', '14'],
       ['20', '21', '22', '23', '24'],
       ['30', '31', '32', '33', '34']]

# 根据内容创建表格
t = Table(data)
# 将表格添加到内容中
story.append(t)
# 将内容输出到PDF中
doc.build(story)

在这里插入图片描述

5.1 表格格式

指定表格格式有两种方式,一种是在调用创建表格接口时,传入style参数,一种是在创建完表格后,调用如下接口:

Table.setStyle(tblStyle)

5.1.1 直接传入style参数

from reportlab.platypus import SimpleDocTemplate, Table
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet

# 调用模板,创建指定名称的PDF文档,输入参数为路径文件名
doc = SimpleDocTemplate("../datas/wws_tables.pdf")
# 获得模板表格
styles = getSampleStyleSheet()
# 指定模板
style = styles['Normal']
# 初始化内容
story = []

# 初始化表格内容
data = [['00', '01', '02', '03', '04'],
       ['10', '11', '12', '13', '14'],
       ['20', '21', '22', '23', '24'],
       ['30', '31', '32', '33', '34']]

# 根据内容创建表格,同时添加格式
t = Table(data,style=[
                     ('GRID', (0, 0), (-1, -1), 1, colors.grey),
                     ('GRID', (1, 1), (-2, -2), 1, colors.green),
                     ('BOX', (0, 0), (1, -1), 2, colors.red),
                     ('BACKGROUND', (0, 0), (0, 1), colors.pink),
                     ('BACKGROUND', (1, 1), (1, 2), colors.lavender),
                     ('BACKGROUND', (2, 2), (2, 3), colors.orange),
                    ]
        )

# 将表格添加到内容中
story.append(t)
# 将内容输出到PDF中
doc.build(story)

在这里插入图片描述

5.1.2 调用setStyle

from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet

# 调用模板,创建指定名称的PDF文档
doc = SimpleDocTemplate("../datas/wws_tables.pdf")
# 获得模板表格
styles = getSampleStyleSheet()
# 指定模板
style = styles['Normal']
# 初始化内容
story = []

# 初始化表格内容
data = [['00', '01', '02', '03', '04'],
       ['10', '11', '12', '13', '14'],
       ['20', '21', '22', '23', '24'],
       ['30', '31', '32', '33', '34']]

# 根据内容创建表格
t = Table(data)

# 然后调用setStyle添加格式
t.setStyle(TableStyle([
                         ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black),
                         ('BOX', (0, 0), (-1, -1), 2, colors.black),
                         ('LINEBELOW', (0, 0), (-1, 0), 2, colors.yellow),
                         ('LINEAFTER', (0, 0), (0, -1), 2, colors.blue),
                         ('ALIGN', (1, 1), (-1, -1), 'RIGHT')
                        ])
            )

# 将表格添加到内容中
story.append(t)
# 将内容输出到PDF中
doc.build(story)

在这里插入图片描述

  • 表格的位置索引方式与列表的索引方式一致
  • 左上角第一个是data[0] [0]
  • 第二行第一个是data[1] [0]
  • 最后一行第一个位置是data[-1] [0],依次类推。

重点表格格式化命令:

  • FONTNAME:字体名称
  • FONTSIZE:字体大小
  • LEADING:行间距
  • TEXTCOLOR:字体颜色
  • ALIGNMENT:水平对齐方式(可选值:“LEFT”,”RIGHT“,”CENTER“)
  • LEFTPADDING:左边填充
  • RIGHTPADDING:右边填充
  • BOTTOMPADDING:底部填充
  • TOPPADDING:顶部填充
  • BACKGROUND:背景色
  • VALIGN:垂直对齐方式(可选值:“TOP”,“MIDDLE”,“BOTTOM”)
  • GRID:表格颜色,被指定的行列中的所有子行和子列都被设置成相应颜色
  • INNERGRID:表格颜色,仅仅修改指定的子行和子列的相应颜色(不包括边框)
  • BOX:边框颜色,被指定的边框的颜色
  • LINEBELOW:指定块底部的行颜色
  • LINEAFTER:指定块右边的行颜色。

6 图片

在调用接口时,支持默认的jpeg格式。接口如下:

Image(filename, width=None, height=None)
  • filename:指定文件名
  • width:指定图片的宽度
  • height:指定图片的高度

如果宽度和高度有一个没有被指定,则参考原来的图片像素。

from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet

from reportlab.platypus import SimpleDocTemplate, Image

from reportlab.lib.styles import getSampleStyleSheet

# 调用模板,创建指定名称的PDF文档
doc = SimpleDocTemplate("../datas/wws_tables.pdf")
# 获得模板表格
styles = getSampleStyleSheet()
# 指定模板
style = styles['Normal']
# 初始化内容
story = []

# 初始化表格内容
data = [['00', '01', '02', '03', '04'],
       ['10', '11', '12', '13', '14'],
       ['20', '21', '22', '23', '24'],
       ['30', '31', '32', '33', '34']]

# 根据内容创建表格, 表格后空两行,不然图片连一块了,难看
t = Table(data, spaceAfter=10)

# 然后调用setStyle添加格式
t.setStyle(TableStyle([
                         ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black),
                         ('BOX', (0, 0), (-1, -1), 2, colors.black),
                         ('LINEBELOW', (0, 0), (-1, 0), 2, colors.yellow),
                         ('LINEAFTER', (0, 0), (0, -1), 2, colors.blue),
                         ('ALIGN', (1, 1), (-1, -1), 'RIGHT')
                        ])
            )

# 将表格添加到内容中
story.append(t)
# 添加图片
IMG = Image("C:\\Users\\admin\\Documents\\index\\PS图片\\20230926-144332.jpg", width=120, height=160)
story.append(IMG)

# 将内容输出到PDF中
doc.build(story)

在这里插入图片描述


参考

python 生成pdf
reportlab 官网案例
reportlab 官方文档
文档官方demo
flask_reportlab
adding-links-to-pdf
Python的reportlab制作pdf时,如何让插入的图片适应pdf的大小
reportlab 中文问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/553153.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网易狼人杀创建房间方法

进入游戏后 如下图 点击 建房 进入后 会要我们选择 自己想玩的板子 例如 我们就选进阶场的第一个 点击后 我们就会进来了

TCP的一些功能详述

文章制作不易&#xff0c;望各位大佬多多点赞&#xff0c;球球各位啦&#xff01;&#xff01;&#xff01;&#xff01; 目录 1.TCP的简介 2.TCP协议中部分数据的理解 1.端口号 2.序列号 3.四位首部长度 4.6位保留位 5. 16位校验和 6.数据&#xff08;TCP的载荷&#…

upload-labs靶场详解

靶场环境 下载链接&#xff1a;https://codeload.github.com/c0ny1/upload-labs/zip/refs/heads/master 使用小皮集成环境来完成这个靶场 将文件放到WWW目录下就可以进行访问 进入关卡后页面呈现&#xff1a; Pass-01&#xff08;前端绕过&#xff09; 我们先尝试上传一个web.…

c++ qt6.5 打包sqlite组件无法使用,尽然 也需要dll支持!这和开发php 有什么区别!

运行 程序会默认使用当前所在文件夹中的 dll 文件&#xff0c;若文件不存在&#xff0c;会使用系统环境变量路径中的文件&#xff1b;又或者是需要在程序源代码中明确指定使用的 dll 的路径。由于我安装 Qt 时将相关 dll 文件路径都添加到了系统环境变量中&#xff0c;所以即使…

arcgis中坡向计算工作原理说明

用于识别出从每个像元到其相邻像元方向上值的变化率最大的下坡方向。坡向可以被视为坡度方向。输出栅格中各像元的值可指示出各像元位置处表面的朝向的罗盘方向。将按照顺时针方向进行测量&#xff0c;角度范围介于 0&#xff08;正北&#xff09;到 360&#xff08;仍是正北&a…

Go: 理解 Sync.Pool 的设计

sync 包提供了一个强大且可复用的实例池&#xff0c;以减少 GC 压力。在使用该包之前&#xff0c;我们需要在使用池之前和之后对应用程序进行基准测试。这非常重要&#xff0c;因为如果不了解它内部的工作原理&#xff0c;可能会影响性能。 池的限制 我们来看一个例子以了解它…

Postman之安装

Postman工具之介绍与安装 Postman是什么&#xff1f;Postman有几种安装方式&#xff1f; Postman是什么&#xff1f; postman是一款http客户端的模拟器&#xff0c;它可以模拟发出各种各样的网络请求&#xff0c;用于接口测试。 Postman有几种安装方式&#xff1f; 两种&…

Java处理CSV类库:OpenCSV

一&#xff1a;CSV简介 Comma-Separated Values(CSV), 因分隔符没有严格指定规范标准&#xff0c;可以使用逗号&#xff0c;也可以使用其他字符&#xff08;如制表符\t、分号;等&#xff09;&#xff0c;所以CSV也称为 逗号分隔值或者字符分隔值。csv文件是使用纯文本来存储表…

专业清洁工匠服务网站模板 html网站

目录 一.前言 二.页面展示 三.下载链接 一.前言 该HTML代码生成了一个网页&#xff0c;包括以下内容&#xff1a; 头部信息&#xff1a;指定了网页的基本设置和元数据&#xff0c;例如字符编码、视口大小等。CSS文件&#xff1a;引入了多个CSS文件&#xff0c;用于设置网页…

书籍架构:一本书的透视骨架

书籍架构:一本书的透视骨架 我们在书籍排版过程中涉及到专用术语,从事出版工作及设计工作的你来说掌握这些尤为重要。 很多新手在出版第一本书时,对于书籍的结构还不是很了解,下面就让我们一起来了解、掌握出书知识。 书,由两部分构成:书皮和书心。 其中…… 书皮 书皮…

pytest学习-pytorch单元测试

pytorch单元测试 一.公共模块[common.py]二.普通算子测试[test_clone.py]三.集合通信测试[test_ccl.py]四.测试命令五.测试报告 希望测试pytorch各种算子、block、网络等在不同硬件平台,不同软件版本下的计算误差、耗时、内存占用等指标. 本文基于torch.testing._internal 一…

sql知识总结二

一.报错注入 1.什么是报错注入&#xff1f; 这是一种页面响应形式&#xff0c;响应过程如下&#xff1a; 用户在前台页面输入检索内容----->后台将前台输入的检索内容无加区别的拼接成sql语句&#xff0c;送给数据库执行------>数据库将执行的结果返回给后台&#xff…

Java 集合(ArrayList、LinkedList、HashMap、HashSet、LinkedHashMap、LinkedHashSet)【补充复习】

Java 集合&#xff08;ArrayList、LinkedList、HashMap、HashSet、LinkedHashMap、LinkedHashSet&#xff09;【补充复习】 Java 集合概述Collection 接口继承树Map 接口继承树 Collection 接口方法使用 iterator 接口遍历集合元素使用 forearch 遍历集合元素 List 接口List 实…

媒体邀约的好处?怎么邀请媒体?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体邀约的好处主要体现在提高品牌知名度、扩大受众群体以及与媒体建立良好的合作关系。 媒体邀约是一种有效的公关策略&#xff0c;通过吸引媒体关注来促进信息的传播。它可以帮助组织…

传统大数据架构与现代数据平台的期望——Lakehouse 架构(二)

文章目录 前言数据仓库数仓基础好处和优势限制和挑战 数据湖数据湖基础好处和优势限制和挑战 现代数据平台云数据湖与云数仓组合架构现代数据平台的期望Lakehouse 架构的出现未来数据平台的默认选择&#xff1f; 总结 前言 本文概述了传统数据架构&#xff1a;数据仓库和数据湖…

【Linux系列】Ctrl + R 的使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

python后端相关知识点汇总(十二)

python知识点汇总十二 1、什么是 C/S 和 B/S 架构2、count(1)、count(*)、count(列名)有啥区别&#xff1f;3、如何使用线程池3.1、为什么使用线程池&#xff1f; 4、MySQL 数据库备份命令5、supervisor和Gunicorn6、python项目部署6.1、entrypoint.sh制作6.2、Dockerfile制作6…

8.Jetson AGX Orin Ubuntu20.04 gRPC编译安装

Jetson AGX Orin Ubuntu20.04 gRPC编译安装 一、CMake版本检查 grpc编译cmake要求最低版本为3.15。首先&#xff0c;cmake -version 查看当前cmake版本&#xff0c;如果低于3.15&#xff0c;按照以下步骤进行安装。 1.1 卸载已经安装的旧版的CMake sudo apt-get autoremove…

Redmi Turbo 3新品发布,天星金融(原小米金融)优惠加持护航新机体验

Redmi新十年使命不变&#xff0c;挑战不断升级。Redmi Turbo 3&#xff0c;作为Turbo系列的开篇之作&#xff0c;将自身定位为新生代性能旗舰&#xff0c;决心重塑中端性能新格局。据悉&#xff0c;Redmi Turbo 3于4月10日已正式发布。预售期间更是连续数日&#xff0c;蝉联小米…

mac终端使用代理加速下载

环境变量增加前IP&#xff1a; 环境变量配置后&#xff0c;新打开一个终端的ip&#xff0c;开始享受极速吧~
最新文章